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框架中的应用参考
2,适配器模式(Adapter)
适配器模式将一个类的接口,转化成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。
适配器分为类适配器和对象适配器,还有接口适配器。类适配器通过多继承(实现接口,继承类),对象适配器就是适配器持有被适配的对象。
有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行
3,外观模式(Facade)
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
比如模拟开机这个动作,CPU、Memory、Disk每个都要start(),这里写个类和方法统一这些start(),开机只需调用这一个方法即可。
4,装饰模式(Decorator)
定义:装饰模式是在不改变原类文件和不使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
这一个解释,引自百度百科,我们注意其中的几点。
1,不改变原类文件。
2,不使用继承。
3,动态扩展功能。
通过实现同一个接口,装饰类或者叫做扩展类持有原类对象,在此基础上动态的添加功能,这样情况就是装饰器模式。