Java设计模式之三
2016-09-08 18:14
218 查看
1,命令模式(Command)
模拟一个遥控开关灯的例子按照正常的思路,应该是遥控器 RemoteControl,直接调用灯的on()或者off()方法,为了调用者和被调用者,或者是发送请求和执行请求的对象松耦合,解耦。这里抽象出命令的对象,具体的各种命令持有执行者的执行方法,比如例子中,遥控器是发送请求者也叫invoker,灯是执行者也叫receiver,实现统一接口Command的LightOnCommand和LightOffCommand具体的命令,LightOnCommand持有灯的on()方法,LightOffCommand持有灯的off()方法。
先看例子再说吧
首先造个 灯,有开和关两个方法
package com.remote3c.command; public class Light { public void on(){ System.out.println("Light is on "); } public void off(){ System.out.println("Light is off"); } }
接着抽象出命令的接口
package com.remote3c.command; public interface Command { void execute(); }两个实现了Command的具体的类,这两个命令封装了接受者(灯)的一个动作(也叫方法)
package com.remote3c.command; public class LightOffCommand implements Command { public Light light; /** * @param light */ public LightOffCommand(Light light) { this.light = light; } public void execute() { light.off(); } }
package com.remote3c.command; public class LightOnCommand implements Command { public Light light; /** * @param light */ public LightOnCommand(Light light) { this.light = light; } public void execute() { light.on(); } }接着再建造一个遥控器,这个遥控器有一个设置命令的方法 setCommand(Command c),还有一个execute()方法
package com.remote3c.command; /** * 遥控器 * @author zhangyoushuai * 2016-9-8 */ public class RemoteControl { public Command command; public void setCommand(Command c){ this.command=c; } public void execute(){ command.execute(); } }
最后就是测试类
package com.remote3c.command; public class test { /** * @author zhangyoushuai * @date 2016-9-8 * @version 1.0.0 * @param args * 模拟一个遥控开关灯的例子 * 按照正常的思路,应该是遥控器 RemoteControl,直接调用灯的on()或者off()方法,为了调用者和被调用者, * 或者是发送请求和执行请求的对象松耦合,解耦。这里抽象出命令的对象,具体的各种命令持有执行者的执行方法 * 比如例子中,遥控器是发送请求者也叫invoker,灯是执行者也叫receiver,实现统一接口Command的LightOnCommand * 和LightOffCommand具体的命令,LightOnCommand持有灯的on()方法,LightOffCommand持有灯的off()方法 * * 这样我们通过遥控器的setCommand()方法,就可以动态的设置命令,执行命令的方法也就执行了(灯)执行者的方法啦 * 这样invoker和receiver 就解耦了,当有新增需求,比如开关吊扇,只需写一个吊扇的类,然后写两个实现了Command * 的命令就可以了,这样的程序扩展性extensibility就很好。 */ public static void main(String[] args) { RemoteControl control= new RemoteControl(); Light light = new Light(); // LightOnCommand on = new LightOnCommand(light); LightOffCommand off = new LightOffCommand(light); control.setCommand(off); control.execute(); } }
结果
Light is off
这样我们通过遥控器的setCommand()方法,就可以动态的设置命令,执行命令的方法也就执行了(灯)执行者的方法啦
这样invoker和receiver 就解耦了,当有新增需求,比如开关吊扇,只需写一个吊扇的类,然后写两个实现了Command
的命令就可以了,这样程序的extensibility就很好。
要点:
*命令模式静发送请求的对象和执行请求的对象解耦
*在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者(执行请求的对象)的一个或者一组方法
*发送请求者通过调用命令对象的execute()方法发出请求,这会使得接受者的方法被调用。
命令模式在MVC框架中的应用参考
http://blog.csdn.net/wsh622827/article/details/4759368
2,适配器模式(Adapter)
适配器模式将一个类的接口,转化成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。适配器分为类适配器和对象适配器,还有接口适配器。类适配器通过多继承(实现接口,继承类),对象适配器就是适配器持有被适配的对象。
有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行
3,外观模式(Facade)
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。比如模拟开机这个动作,CPU、Memory、Disk每个都要start(),这里写个类和方法统一这些start(),开机只需调用这一个方法即可。
4,装饰模式([b]Decorator)[/b]
定义:装饰模式是在不改变原类文件和不使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。这一个解释,引自百度百科,我们注意其中的几点。
1,不改变原类文件。
2,不使用继承。
3,动态扩展功能。
通过实现同一个接口,装饰类或者叫做扩展类持有原类对象,在此基础上动态的添加功能,这样情况就是装饰器模式。
相关文章推荐
- Qt的两种迭代器(Java和STL)
- springmvc+hibernate+mysql
- Eclipse Project Explorer 无效的项目清除
- Eclipse Project Explorer 无效的项目清除
- 第一个java程序
- RxJava的简单使用
- JAVA log4j日志基本运用
- java工作之后需要看的书籍
- java 压缩和解压缩Zip、Jar、Gzip文件实例代码
- JavaEE框架——mybatis和spring整合
- Android真机在eclipse上调试
- java中由类名和方法名字符串实现其调用【反射机制】
- 利用proguard对java web工程代码混淆
- 覆写 Exception 的 fillStackTrace 方法提高 Java 性能
- 通过Java反射调用方法
- Java中的反射(2)——利用反射分析类的基本能力
- JAVA语言常识
- java多态
- ()-> java8:Lambda表达式
- Spring加载XSD文件小结(解决nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreE)