GOF设计模式-装饰模式

来源:互联网 发布:手机淘宝怎么发布帖子 编辑:程序博客网 时间:2024/06/05 20:36

不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

这里写图片描述

  • Component:抽象组件,给对象动态的添加职责。
  • ConcreteComponent:组件具体实现类。
  • Decorator:抽象装饰者,继承Component,从外类来拓展Component类的功能,但对于Component来说无需知道Decorator的存在。
  • ConcreteDecorator:装饰者具体实现类。

举个改装越野车的例子

我们现在有辆车要改成帕杰罗,和普拉多式的硬派越野车。

首先定义一个car的接口(Component)

public interface Car {    public void getCar();}

然后购买一辆车MyCar(ConcreteComponent)

public class MyCar implements Car {    @Override    public void getCar() {        System.out.println("这里是家用车原型。");    }}

创建一个抽象的越野车JeepCar(Decorator)
注意这里一定要把Car引进来,不然就没法装饰了

public abstract class JeepCar implements Car{    private Car car;    public JeepCar(Car car) {        this.car = car;    }    @Override    public void getCar() {        car.getCar();    }    protected void baoxiangang(){        System.out.println("加装防撞钢梁");    }    protected void jiaopan(){        System.out.println("加装拖车绞盘");    }    protected void tanzhaodeng(){        System.out.println("假装探照灯");    }    protected void jianzhen(){        System.out.println("更换减震套装,提高地盘高度");    }}

具体的装饰类Pajero,Prado。装饰的顺序可以自己随意定义(当然也可以先装饰再买车)

public class Pajero extends JeepCar {    public Pajero(Car car) {        super(car);    }    @Override    public void getCar() {        super.getCar();        baoxiangang();        jiaopan();        tanzhaodeng();        jianzhen();        System.out.println("帕杰罗改装完成!");    }}
public class Prado extends JeepCar {    public Prado(Car car) {        super(car);    }    @Override    public void getCar() {        super.getCar();        baoxiangang();        jiaopan();        tanzhaodeng();        jianzhen();        System.out.println("普拉多改装完成!");    }}

好了,写个测试类

public class Test {    public static void main(String[] args) {        Car myCar = new MyCar();        Pajero pajero = new Pajero(myCar);        pajero.getCar();        System.out.println("=========我是华丽的分割线============");        Prado prado = new Prado(myCar);        prado.getCar();    }}

OK,两辆越野车已经改装完毕,可以去西藏了………..

推荐使用组合而非继承的方式,动态的来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。这样能有效的避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。

代码地址:https://github.com/mazh1992/model/

0 0
原创粉丝点击