Android 高级进阶Android开发经验谈Android技术知识

Android 设计模式-装饰模式(Decorator Patt

2018-05-10  本文已影响48人  Code猎人

定义

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

UML结构图

抽象组件接口

/**
 - 统一的组价对象接口
 */
 public abstract class Component {
 //抽象方法 没有具体操作
  public abstract void operate();
}

具体实现类,被装饰者

 /**
* 具体实现组件对象接口的对象 被装饰的原始对象
*/
public class ConcreteComponent extends Component {

@Override
public void operate() {
    //重写方法 做基本的操作  
    System.out.print("去约妹子!");
}
}

抽象的装饰者,持有一个被装饰者的引用

/**
* 所有装饰器的抽象父类 持有接口 转发请求
*/
public abstract class Decorator extends Component {

/**
 * 内部持有的组件接口对象
 */
protected Component component;

public Decorator(Component component) {
    this.component = component;
}
/**
 * 转发请求给组件对象 这里可以做一些附加操作
 */
@Override
public void operate() {
    component.operate();
}
}

两个装饰者

/**
* 某个具体装饰器实现对象,调用接口方法和具有自己的方法 并能够附加上去
 */
public class ConcreteDecoratorA  extends Decorator{

public ConcreteDecoratorA(Component component) {
    super(component);
}

public int operateA(){
    System.out.print("A约妹子之前要弄个帅气的发型");
    return 0;
}

@Override
public void operate() {
    operateA();
    super.operate();
}
}

public class ConcreteDecoratorB  extends Decorator{

public ConcreteDecoratorB(Component component) {
    super(component);
}

public int operateB(){
    System.out.print("B约妹子之前要弄身漂亮衣服");
    return 0;
}

@Override
public void operate() {
    operateB();
    super.operate();
}
}

客户端调用

public class Client {

public static void main(String[] args){
   Component component = new ConcreteComponent();
    ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(component);
    ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(component);

    concreteDecoratorA.operate();
    concreteDecoratorB.operate();

}

}

输出内容

A约妹子之前要弄个帅气的发型
去约妹子!
B约妹子之前要弄身漂亮衣服
去约妹子!

Android中的装饰者模式

经常使用的Context其实用的就是包装模式
我们知道Activity、Services、Application他们都继承了ContextWrapper类。根据这个名字就觉得这是一个装饰类。装饰类里面会持有一个被装饰者的引用

package android.content;
public class ContextWrapper extends Context {
Context mBase;

public ContextWrapper(Context base) {
    mBase = base;
}

protected void attachBaseContext(Context base) {
    if (mBase != null) {
        throw new IllegalStateException("Base context already set");
    }
    mBase = base;
}
@Override
public AssetManager getAssets() {
    return mBase.getAssets();
}
}

是不是似曾相识的感觉,这就是Context的装饰类,有兴趣的童鞋可以继续在源码中看下去,下面看下他们几个的关系

优点

是继承的一种替代方案,但是比继承要灵活的多,可以在运行时通过传入不同的被装饰器或不同的装饰器来达成不同的行为。
增加新的被装饰类和装饰类很方便,而且不用修改原有代码。便于拓展。符合开闭原则。

缺点
设计模式基本都有这个缺点,就是会生成额外的类,增加系统复杂度。
由于装饰可以层层包装,交叉包装,如果包装的很深的话,调试排错会比较麻烦,也不容易理解。

总结

上一篇 下一篇

猜你喜欢

热点阅读