装饰设计——开放拓展,关闭修改

1. 设计原则

遵循开闭原则:对拓展开放,对修改关闭。

2. 特点:

1、装饰对象和真实对象有相同的接口。
2、装饰对象包含一个真实对象的引用。

3. 优缺点

优点:动态的给一个对象添加一些额外的职责,就扩展功能而言,比生成子类方式更为灵活。
缺点:利用装饰模式,常常造成设计中有大量的子类。(设计模式的通病)

4. 角色组成

1、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
2、具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
3、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
4、具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

5 Demo

Component角色

public abstract class Car {
    public abstract void drive();
}

Concrete Component角色

public class AodiCar extends Car {
    @Override
    public void drive() {
        Log.e("aodi","开的是奥迪");
    }
}

Decorator角色

public abstract class AbsCar extends Car {
    public Car car;


    public AbsCar(Car car) {
        this.car = car;
    }

    @Override
    public void drive() {
        car.drive();
    }
}

Concrete Decorator角色

public class ConcreateAbsCar extends AbsCar {
    public ConcreateAbsCar(Car car) {
        super(car);
    }

    @Override
    public void drive() {
        super.drive();
        drive1();
        drive2();
    }

    private void drive1() {
        //do something
    }

    private void drive2() {
        //do something
    }
}

client调用

 /**
     * 装饰设计模式测试:在不改变别人api的情况下,加上自己的实现
     */
    public void testWrapper() {
        Car car = new AodiCar();
        AbsCar absCar = new ConcreateAbsCar(car);
        absCar.drive();
    }

其实在android源码中:
Activity继承ContextThemeWrapper继承ContextWrapper继承Context——>这种wrapper就是包装的一个体现,具体的在ContextWrapper中的实现都是调用了Context的实现类ContextImpl中的方法。前面说装饰是为了拓展,那么拓展就是由ContextWrapper的具体子类完成,比如Activity,Service,Application。

收工!

展开阅读全文

没有更多推荐了,返回首页