java学习

java学习

 

设计模式之命令模式

 命令模式就是将一组对象的相似行为,进行了抽象,将调用者与被调用者之间进行解耦,提
高了应用的灵活性。命令模式将调用的目标对象的一些异构性给封装起来,通过统一的方式来为调用者提供服务。
适用场景
    1、当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。
      2、例如当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时。
      3、有时候调用者调用目标对象后,需要回调一些方法。
例子:
命令接口:
public interface Commond {

    public void execute();
}
命令接口实现类:
public class LightOnCommond implements Commond{

    private Light light;
    public LightOnCommond(Light light) {
        this.light = light;
    }
    
    @Override
    public void execute() {
        light.on();
    }

}
命令的调用者:
public class Light {

    public void on() {
        System.out.println("灯亮了");
    }
}
public class TurnTvCommond implements Commond {
    
    private Tv tv;
    public TurnTvCommond(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turn();

    }

}

public class Tv {

    public void turn() {
        System.out.println("调台");
    }
}
同时执行的多个命令数组
public class MracoCommond implements Commond{

    private Commond[] commonds;
    
    public MracoCommond(Commond...commonds) {
        this.commonds = commonds;
    }
    
    @Override
    public void execute() {
        for(Commond cmd : commonds) {
            cmd.execute();
        }
    }

}
命令的包装类,
public class RemoteContro {

    private List<Commond> commondList = new ArrayList<Commond>();
    
    public void setCommond(Commond commond) {
        commondList.add(commond);
    }
    
    public void buttonWasPressed(int index){
        commondList.get(index-1).execute();
    }
}
public class Test {

    public static void main(String[] args) {
        
        Light light = new Light();
        LightOnCommond loc = new LightOnCommond(light);        
        Tv tv = new Tv();
        TurnTvCommond ttc = new TurnTvCommond(tv);        
        MracoCommond mc = new MracoCommond(loc,ttc);
        RemoteContro rc = new RemoteContro();
        rc.setCommond(ttc);
        rc.setCommond(loc);
        rc.setCommond(mc);
        //rc.buttonWasPressed(3);
        //rc.buttonWasPressed(1);
        rc.buttonWasPressed(2);
        
    }
}
当输入123不同时,调用的命令不同,实现了多个命令的包装

posted on 2013-04-23 13:01 杨军威 阅读(154) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜