七、java设计模式之装饰器设计模式(结构型设计模式)

装饰器设计模式(Decorator Pattern)

  • 也叫包装设计模式,属于结构型模式,它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构
  • 给对象增加功能,一般两种方式 继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承模式更加灵活

角色(装饰者和被装饰者有相同的超类(Component))

  • 抽象组件(Component)

    • 定义装饰方法的规范,最初的自行车,仅仅定义了自行车的API;
  • 被装饰者(ConcreteComponent)

    • Component的具体实现,也就是我们要装饰的具体对象
    • 实现了核心角色的具体自行车
  • 装饰者组件(Decorator)

    • 定义具体装饰者的行为规范, 和Component角色有相同的接口,持有组件(Component)对象的实例引用

    • 自行车组件 都有 名称和价格

  • 具体装饰物(ConcreteDecorator)

    • 负责给构件对象装饰附加的功能
    • 比如 喇叭,防爆胎

装饰器设计模式案例实战

/**
 * 自行车抽象类
 */
public interface Bike {
    
    String getDescription();

    int getPrice();
}


/**
 *具体被装饰者,小号自行车
 */
public class SmallBike implements Bike {
private String description = "小号自行车";

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 价格100元
     * @return
     */
    @Override
    public int getPrice() {
        return 100;
    }
}


/**
 *具体被装饰者,大号自行车
 */
public class BigBike implements Bike {
private String description = "大号自行车";

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 价格200元
     * @return
     */
    @Override
    public int getPrice() {
        return 200;
    }
}



/**
 * 装饰器统一父类
 */
public class BikeDecorator implements Bike {
    private String description = "我只是装饰器,啥也不表示,子类帮我传递";

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public int getPrice() {
        return 0;
    }
}



/**
 * 防爆胎
 */
public class RSCBikeDecorator extends BikeDecorator{

    private String description = "增加一个防爆胎";

    private Bike bike;

    public RSCBikeDecorator(Bike bike) {
        this.bike = bike;
    }

    @Override
    public String getDescription() {
        return bike.getDescription()+","+description;
    }

    //100是防爆胎的价格
    @Override
    public int getPrice() {
        return bike.getPrice()+100;
    }
}




/**
 * 喇叭
 */
public class SuonaBikeDecorator extends BikeDecorator{

    private String description = "增加一个喇叭";

    private Bike bike;

    public SuonaBikeDecorator(Bike bike) {
        this.bike = bike;
    }

    @Override
    public String getDescription() {
        return bike.getDescription()+","+description;
    }

    //50是喇叭的价格
    @Override
    public int getPrice() {
        return bike.getPrice()+50;
    }
}

main方法代码

//        8.装饰器设计模式
//        选个自行车
        Bike bigBike = new BigBike();
        //搭配一个防爆胎
        bigBike = new RSCBikeDecorator(bigBike);
        //搭配一个喇叭
        bigBike = new SuonaBikeDecorator(bigBike);
        //再搭配一个喇叭
        bigBike = new SuonaBikeDecorator(bigBike);
        System.out.println(bigBike.getDescription()+"---价格---"+bigBike.getPrice());

 

  • 优点

    • 装饰模式与继承关系的目的都是要扩展对象的功能,但装饰模式可以提供比继承更多的灵活性。
    • 使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,原有代码无须改变,符合“开闭原则”
  • 缺点

    • 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂 (多层包装)
    • 增加系统的复杂度,加大学习与理解的难度

装饰器模式和桥接模式对比

  • 相同点都是通过封装其他对象达到设计的目的,和对象适配器也类似,有时也叫半装饰设计模式

  • 没有装饰者和被装饰者的主次区别,桥接和被桥接者是平等的,桥接可以互换,不用继承自同一个父类

    比如例子里面的,可以是Phone持有Color,也可以是Color持有Phone

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值