设计模式——装饰模式(Decorator Pattern)

前言

本篇文章介绍了结构型模式——Decorator Pattern

有关设计模式内容可以翻翻我之前的文章浅谈设计模式及Singleton

装饰(Decorator)模式

装饰模式主要用于在运行时修改或拓展实例的行为。

一般来说,继承可以拓展类的功能,但代码使用继承有很大缺点。

通过装饰模式,我们可以选择一个类的某个对象,并对其进行修改,而不会影响这个类的其他实例。

UML图

Decorator

  • 抽象构件(Component):用于能动态添加功能的对象
  • 具体组件(ConcreteComponent):定义一个需要装饰的原始类
  • 装饰角色(Decorator):持有构件对象的实例,,并定义一个与抽象构件接口一致的接口
  • 具体装饰角色(ConcreteDecorator):负责对构件对象进行装饰

代码示例

场景示例:
以改装比亚迪汽车为例,

  1. 抽象构件(Component)
public interface ICar {
    public void showComponent();
}
  1. 具体组件(ConcreteComponent)
public class BYD implements ICar{
	//裸车
    @Override
    public void showComponent() {
        System.out.println("比亚迪拖拉机");
    }
}
  1. 抽象装饰角色(Decorator)
public abstract class CarDecorator implements ICar{
    private ICar car = null;

    public CarDecorator(ICar car){
        this.car = car;
    }
    public void showComponent(){
        this.car.showComponent();
    }
}
  1. 具体装饰角色(ConcreteDecorator)
public class ConcreteDecorator extends CarDecorator{
    public ConcreteDecorator(ICar car) {
        super(car);
    }

 	@Override
    public void showComponent() {
        super.showComponent();
        addGps();
        addGrapher();
    }
    
    public void addGps(){
        System.out.println("加装GPS");
    }
    
    public void addGrapher(){
        System.out.println("加装行车记录仪");
    }
   
}
  1. 测试类
 public class Demo {
    public static void main(String[] args) {
        ICar car = new BYD();
        CarDecorator decorator = new ConcreteDecorator(car);
        decorator.showComponent();
    }
}
  1. 结果
    结果

这样我们就完成了用装饰类来修饰基础组件

当我们想要再进行修饰的话,才会体现出装饰模式的优点

  1. 新建装饰类
public class ConcreteDecorator1 extends ConcreteDecorator{
    public ConcreteDecorator1(CarDecorator cd) {
        super(cd);
    }

    public void addWheel(){
        System.out.println("加装备胎");
    }

    @Override
    public void showComponent() {
        super.showComponent();
        addWheel();
    }
}
  1. 再次测试
public class Demo {
    public static void main(String[] args) {
        ICar car = new BYD();
        CarDecorator decorator = new ConcreteDecorator(car);
        CarDecorator decorator1 = new ConcreteDecorator1(decorator);
        decorator1.showComponent();
    }
}
  1. 结果
    结果
    结合UML图分析哦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值