您的位置:首页 > 编程语言 > Java开发

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,动态扩展功能。

       通过实现同一个接口,装饰类或者叫做扩展类持有原类对象,在此基础上动态的添加功能,这样情况就是装饰器模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: