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

桥接模式

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

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

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

//手机软件抽象类
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月底没有将设计模式看完。原因很多。但就是没看完。要加油了。
那天很开心。谢谢老师。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值