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

       通过实现同一个接口,装饰类或者叫做扩展类持有原类对象,在此基础上动态的添加功能,这样情况就是装饰器模式。