`
瘋叻ハ.兩
  • 浏览: 80615 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

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

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

    design-pattern-java.pdf

    六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法...

    C#设计模式.PDF

    四、 工厂方法模式与简单工厂模式 33 五、 Factory Method模式演化 34 六、 Factory Method模式与其它模式的关系 35 七、 另外一个例子 35 C#设计模式(6)-Abstract Factory Pattern 38 一、 抽象工厂(Abstract ...

    C#设计模式大全

    四、 工厂方法模式与简单工厂模式 五、 Factory Method模式演化 六、 Factory Method模式与其它模式的关系 七、 另外一个例子 C#设计模式(6)-Abstract Factory Pattern 一、 抽象工厂(Abstract Factory)...

    《设计模式实训教程》【PPT+类图与代码+样章】

    3.2.1简单工厂模式实例之图形工厂 3.2.2工厂方法模式实例之日志记录器 3.2.3抽象工厂模式实例之数据库操作工厂 3.2.4建造者模式实例之游戏人物角色 3.2.5原型模式实例之快速创建工作周报 3.2.6单例模式实例之多...

    ActionScript 3.0设计模式扫描版_方红琴译

    第1章 面向对象程序设计、设计模式和ActionScript 3.0 成功之后的喜悦 OOP基础 抽象 封装 继承 多态性 使用设计模式进行软件开发的原则 使用接口而不是具体的实现 养成使用组合的习惯 计划项目时要同时...

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

    81.6.1 寻找合适的对象 81.6.2 决定对象的粒度 91.6.3 指定对象接口 91.6.4 描述对象的实现 101.6.5 运用复用机制 131.6.6 关联运行时刻和编译时刻的结构 151.6.7 设计应支持变化 161.7 怎样选择设计模式 191.8 怎样...

    Android源码设计模式解析与实战

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察...

    何红辉关爱民-Android源码设计模式解析与实战(带书签第2版).pdf

    一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、...

    Android 源码设计模式解析与实战

    优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、...

    何红辉关爱民-Android源码设计模式解析与实战(带书签高清第2版).pdf

    优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、...

    《Android 源码设计模式解析与实战》

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察...

    Delphi模式编程第一分卷

    1.3.2 利用继承实现变化的封装和简单的复用 1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系...

    Android源码设计模式解析与实战PDF

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察...

    Delphi模式编程第二分卷

    1.3.2 利用继承实现变化的封装和简单的复用 1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 ...

Global site tag (gtag.js) - Google Analytics