`
瘋叻ハ.兩
  • 浏览: 82351 次
  • 性别: Icon_minigender_1
  • 来自: 宁德
社区版块
存档分类
最新评论

面向接口 ---- 简单工厂模式和命令模式

 
阅读更多

      初次学完抽象类和接口的童鞋,看多了“面向接口编程"字眼,也见多了“面向接口”的好多好处,总会感觉其神秘。然而有些书不给示例,总让我们感觉它的高不可攀,不知其所用。本篇将简单而又完整的介绍2个面向接口编程的例子。

 

    一、简单工程模式

      情景1:一个机器类Computer需要具体的输出设备Printer,有较好的两种方式选择:直接在Computer类中组合Printer类; 在2者之间搭个中介OutPut,使Computer组合OutPut,Printer实现OutPut。 那么如何选择哪种方式呢?暂且选第二种,至于为什么,且看代码慢慢分析...

      1、机器类Computer

/**************************************************
 * a machine    【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午01:35:30                                               
 ***************************************************/
public class Computer {
	
	// associate OutPut
	private OutPut out;
	
	public Computer(OutPut out){
		this.out = out;
	}
	
	// to test, i change the return value
	public String keyIn(String msg){
		// pay attention to what out use the method 
		return out.getData(msg);
	}
	
	public void print(String msg){
		out.out(msg);
	}
}


 

      2、接口OutPut:

/**************************************************
 *  OutPut interface      【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午01:36:28                                               
 ***************************************************/
public interface OutPut {
		
	/**
	 * in the Computer class, out use getData() and out() method
	 * 
	 * so what the interface defines method obeies the needs
	 */
	
	// the mothed in the interface is "public abstract" defaultly
	public abstract String getData(String msg);
	
	// so it's ok for you to ignore the "abstract" keyword
	public void out(String msg);
}

 

      3、输出设备Printer:

/**************************************************
 * one of the output device.        【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午01:42:33                                               
 ***************************************************/
public class Printer implements OutPut{

	/**
	 * override abstract method to be specific.
	 */
	
	@Override
	public String getData(String msg) {
		return msg;
	}

	@Override
	public void out(String msg) {
		System.out.println(msg);
	}
}

 

      4、生产OutPut具体对象的工厂类OutPutFactory:

/**************************************************
 * the output factory      【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午01:41:26                                               
 ***************************************************/
public class OutPutFactory {
	
	// you can't instantiate an interface, however, you can refer to the interface
	public OutPut getOutPut(){
		
		return new Printer();
	}
}

 

     5、测试类Test:

/**************************************************
 * test class.   【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午02:20:00                                               
 ***************************************************/
public class Test {

	public static void main(String[] args) {
		OutPutFactory of = new OutPutFactory();
		Computer cp = new Computer(of.getOutPut());
		
		cp.print(cp.keyIn("这就是简单的工厂模型"));
	}

}

 

这种模型降低了程序间的耦合,即降低程序之间的依赖程度。假如机器Computer升级,不需要低级的Printer设备,想换成BetterPrinter设备,那么只要让BetterPrinter实现OutPut接口、另在工程类修改生产的对象名即可,这样即使大数量的机器Computer升级输入设备也只要这么简单的代码即可完成系统升级。 再看第一种情况-- 直接组合Printer,那么如果百来个Computer需要升级Printer,那么就要修改百来份Computer代码。这就是面向接口的好处之一。

 

    二、命令模式

      情景2:假如有个方法需要遍历一个数组,但无法确定在遍历数组时如何处理数组元素,需要在调用该方法时具体指定。 本质上说,这个要求就类似在方法里传一个具体的方法操作作为形参。且看代码实现。

      1、处理数组类HandleArrays:

/**************************************************
 *               【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午03:12:15                                               
 ***************************************************/
public class HandleArrays {

	public void handle(int[] target, Command cmd){
		cmd.process(target);
	}
}

   

      2、命令接口Command:

/**************************************************
 * interface command.    【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午03:09:22                                               
 ***************************************************/
public interface Command {
	
	// to encapsulate behavior
	public void process(int[] target);
}

 

      3、处理方式之-- 打印PrintCommand:

/**************************************************
 * handle in printing.   【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午03:18:59                                               
 ***************************************************/
public class PrintCommand implements Command {

	@Override
	public void process(int[] target) {
		for(int temp : target){			
			System.out.println("输出目标数组的元素是:" + temp);
		}
	}
}

 

      4、处理方式之-- 求和AddCommand:

/**************************************************
 * handle in printing.   【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午03:18:59                                               
 ***************************************************/
public class PrintCommand implements Command {

	@Override
	public void process(int[] target) {
		for(int temp : target){			
			System.out.println("输出目标数组的元素是:" + temp);
		}
	}
}

      ......还有很多处理方式

 

      5、测试类Test:

/**************************************************
 *               【 群:152380972 】                                
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-14 下午03:16:05                                               
 ***************************************************/
public class Test {

	public static void main(String[] args) {
		
		HandleArrays ha = new HandleArrays();
		int[] target = {3, -4, 6, 4};
		ha.handle(target, new PrintCommand());
		System.out.println("-----------------------");
		ha.handle(target, new AddCommand());
	}
}

 

       代码很简单吧? 如果你没见过类似代码,可以复制到IDE运行并思考其运行过程,相信会让你重新认识接口,有了新的编码风格。个人其实慢慢熟练这些模型,对你以后对解读框架也是有很大的帮助,毕竟“九层之台起于垒土,千里之行始于足下”!希望本篇对你理解“面向接口”有所帮助...

      

       谢谢您的欣赏!

0
1
分享到:
评论

相关推荐

    23种 设计模式---面向对象的基本原则

    - 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - 构建者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示...

    漫谈设计模式-从面向对象开始

    3. 行为型模式:涉及对象之间的职责分配,包括命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式等。 每种模式都有其使用场景和优缺点,...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。 - 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示...

    李建忠 C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    在C#编程中,抽象工厂模式常用于框架和库的设计,例如数据库访问层,根据不同的数据库提供商(如SQL Server、Oracle等)创建对应的数据库连接和命令对象。在“李建忠 C#面向对象设计模式纵横谈(3):Abstract Factory...

    设计模式:可复用面向对象软件的基础--详细书签版

    特别地,Christopher Alexander和他的同事们可能最先将模式语言(pattern language)应用于城市建筑领域,他的思想和其他人的贡献已经根植于面向对象软件界。简而言之,软件领域中的设计模式为开发人员提供了一种...

    设计模式-可复用面向对象软件的基础

    常见的有策略模式、命令模式、观察者模式等。 - **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法独立于使用它的客户而变化。 - **观察者模式**:定义了对象之间的一...

    设计模式可复用面向对象软件的基础 源码

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。 - 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **抽象工厂模式**(Abstract Factory):提供一个接口,用于创建相关或依赖对象的族,而无需指定它们具体的类。 - **建造者模式**(Builder):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

    面向对象培训-设计模式

    行为型模式则关注对象之间的交互和职责分配,如观察者模式、策略模式、命令模式等。 在面向对象培训中,设计模式的学习通常包括以下几个关键点: 1. **单一职责原则**(Single Responsibility Principle, SRP):...

    Java设计模式----通俗易懂版

    - 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,无需指定它们的具体类。 - 建造者模式:将复杂对象的构建与其表示分离,使同样的构建过程能创建不同的表示。 - 原型模式:通过复制已有对象来创建...

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则

    - 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式、迭代器模式、访问者模式、备忘录模式和解释器模式。这些模式主要处理对象之间的交互和行为。 在C#中,例如,我们可以使用单例模式来确保...

    设计模式--可复用面向对象软件的基础

    1. **抽象工厂模式**:提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。 2. **工厂方法模式**:定义了一个创建对象的接口,但让子类决定实例化哪一个类。它使得一个类的实例化延迟到...

    面向对象10个设计模式类图和总结

    六、命令模式 定义:把一个请求封装一个对象,用不同的请求队列和日志来参数化其他的对象。 应用条件:需要将请求参数化 案例:遥控器 类图: * Command(命令) + execute(执行命令) * Invoker(调用者) ...

    C#面向对象设计模式纵横谈(25):设计模式总结

    1. 工厂模式:工厂模式是一种创建型设计模式,提供了一种创建对象的最佳方式,通过抽象工厂接口,避免了代码与具体类的耦合,提高了系统的可扩展性。 2. 单例模式:单例模式确保一个类只有一个实例,并提供全局访问...

    单例模式_命令模式

    单例模式和命令模式是两种常见的设计模式,在软件开发中有着广泛的应用。它们分别解决了不同的问题,但在实际项目中,可以巧妙地结合使用,以提高代码的灵活性和可维护性。 单例模式是一种确保一个类只有一个实例,...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template Method...

    设计模式--可复用的面向对象软件的基础

    在C++中,命令模式可以通过定义命令接口和具体命令类来实现,008.PDF可能对此有详细的介绍。 9. **状态模式**(State):允许对象在其内部状态改变时改变其行为。在C++中,状态模式通常涉及到状态类的继承结构和上...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    java之设计模式--各种设计模式解析

    本篇将详细解析几种常见的设计模式,包括单例模式、工厂模式和命令模式。 首先,我们来看工厂方法模式。在软件开发中,经常遇到需要创建对象,但具体创建哪种类型的对象取决于特定条件的情况。工厂方法模式提供了一...

    设计模式-Java语言中的应用

    创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如策略模式、模板方法模式...

Global site tag (gtag.js) - Google Analytics