大话设计模式-----(九)桥接模式、命令模式

来源:互联网 发布:cool edit pro mac 编辑:程序博客网 时间:2024/05/21 09:57

桥接模式

将抽象部分与他的实现部分分离,使他们都可以独立地变化

实现指的是抽象类和他的派生类用来实现自己的对象

就像不同牌子的手机,会有不同的功能,要是抽象手机,然后逐个添加功能,很多功能大家都有,但也有一些特殊的。把功能也抽象出来。 尽量使用合成/聚合,尽量不要使用类继承。将手机软件传入手机类。因为针对抽象接口编程。直接调用抽象定义的方法。

//手机软件抽象类abstract class HandSetSoft{    public abstract void Run();} 
//手机软件具体类class HandSetGame extends HandSetSoft{    @Override    public void Run() {        // TODO Auto-generated method stub        System.out.println("运行手机游戏");    }}class HandSetAddressList extends HandSetSoft{    @Override    public void Run() {        // TODO Auto-generated method stub        System.out.println("运行手机通讯录");    }}
//手机品牌类abstract class HandSetBrand{    HandSetSoft soft;    public void SetHandSetSoft(HandSetSoft soft){        this.soft = soft;    }    public void Run(){        soft.Run();    }}
//具体手机class HandSetBrandN extends HandSetBrand{    @Override    public void Run(){        System.out.println("我是N牌手机");        super.Run();    }}class HandSetBrandM extends HandSetBrand{    @Override    public void Run(){        System.out.println("我是M牌手机");        super.Run();    }}

客户端

public static void main(String[] args) {        HandSetBrandN n = new HandSetBrandN();        n.SetHandSetSoft(new HandSetGame());        n.Run();        n.SetHandSetSoft(new HandSetAddressList());        n.Run();        HandSetBrandM m = new HandSetBrandM();        m.SetHandSetSoft(new HandSetGame());        m.Run();

这里写图片描述

用书上的手机例子不是很好。现在的软件一般直接就可以用。不分手机品牌了~

命令模式

让行为请求者与行为实现者解耦合

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

就像开一个烧烤店,不可能厨师来接待你,然后一个一个烤。要一个服务员来传递命令,也就是点餐。

先定义一个厨师

//厨师class Barbecuer{    //烤羊肉串    public void BakeMutton(){        System.out.println("厨师烤羊肉串");    }    //烤鸡腿    public void BakeChickenWing(){        System.out.println("厨师烤鸡腿鸡腿");    }} 

对厨师下达的命令进行抽象,然后具体的继承类就是烤什么

//抽象命令abstract class Command{    Barbecuer receiverBarbecuer;    public Command (Barbecuer reBarbecuer){        this.receiverBarbecuer = reBarbecuer;    }    //执行命令    abstract public void ExcuteCommand();}

具体烧烤
重写了toString方法,用来判断点的烧烤还有没了

//具体命令类//烤羊肉串class BakeMuttonCommand extends Command{    public BakeMuttonCommand(Barbecuer reBarbecuer) {        super(reBarbecuer);        // TODO Auto-generated constructor stub    }    @Override    public void ExcuteCommand() {        // TODO Auto-generated method stub        receiverBarbecuer.BakeMutton();    }    @Override    public String toString(){        return "BakeMuttonCommand";    }}//烤鸡腿class BakeChickenWing extends Command{    public BakeChickenWing(Barbecuer reBarbecuer) {        super(reBarbecuer);        // TODO Auto-generated constructor stub    }    @Override    public void ExcuteCommand() {        // TODO Auto-generated method stub        receiverBarbecuer.BakeChickenWing();    }    @Override    public String toString(){        return "BakeChickenWing";    }}

再定义个服务员

//服务员class Waiter{    private List<Command> orders = new ArrayList<Command>();    //设置订单    public void SetOrder(Command command){        if(command.toString()=="BakeChickenWing"){            System.out.println("抱歉,没有鸡腿了");        }        else{            orders.add(command);            System.out.println("增加订单:"+command.toString());        }    }    public void CancelOrder(Command command){        orders.remove(command);        System.out.println("取消订单:"+command.toString());    }    //通知厨师订单    public void Notify(){        for(Command command :orders){            command.ExcuteCommand();        }    }}

客户端

    //先说明谁做烧烤,命令接受者        Barbecuer boyBarbecuer = new Barbecuer();        Command bakeMuttonCommand = new BakeMuttonCommand(boyBarbecuer);        Command backChickWingCommand = new BakeChickenWing(boyBarbecuer);        Waiter girl = new Waiter();        //点餐        girl.SetOrder(backChickWingCommand);        girl.SetOrder(bakeMuttonCommand);        girl.SetOrder(bakeMuttonCommand);        girl.Notify();

这里写图片描述

定义个命令接受者,抽象命令,命令的构造函数传入命令接受者。接受者执行命令。
定义命令传达者。进行List来增删命令和判断,传达调用命令。
命令传达者接受客户端传入的命令。执行。
嗯,3月底没有将设计模式看完。原因很多。但就是没看完。要加油了。
那天很开心。谢谢老师。

0 0