Java 设计模式之装饰者模式(三)

  • 在程序开发过程中,想要在不改变某个原类文件和不使用继承的情况下动态的扩展这个对象的功能,那么装饰者模式应该是最好的选择了.
  • 装饰者模式是继承关系的一个替代方案,它比继承更加的灵活,也能有效的减少当需要大量独立的扩展时大量子类的产生.
  • 说一个简单的例子,一个手机,我们可以给它披上无数层不一样的外壳,但是手机还是这个手机,它的的本质是没有变化的.

因为要装饰的对象是一个手机,所以可以把手机抽象为一个基类

/**
 * Component
 * 被装饰者的基类
 */
public interface Phone {
    void call();//打电话功能
}

华为手机是实现手机接口的一个具体被装饰者 

/**
 * ConcreteComponent  被装饰者
 * 华为手机
 */
public class Huawei implements Phone {

    @Override
    public void call() {
        System.out.println("给我媳妇打个电话!");
    }
}

 把手机壳抽象为装饰者的基类

/**
 * Decorator 装饰者基类
 * 手机壳
 */
public  class Housing implements Phone {
    private Phone phone;
    public Housing(Phone phone){
        this.phone = phone;
    }

    @Override
    public void call() {
        phone.call();
    }
}

 实现装饰者基类的具体装饰者A

/**
 * ConcreteDecorator 装饰者
 * 哆啦A梦手机壳
 */
public class Doraemon extends Housing {


    public Doraemon(Phone phone) {
        super(phone);
    }

    @Override
    public void call() {
        System.out.println("套上个哆啦A梦手机壳");
        super.call();
    }
}

实现装饰者基类的具体装饰者B 

/**
 * ConcreteDecorator 装饰者
 * 海贼王手机壳
 */
public class OnePiece extends Housing {

    public OnePiece(Phone phone) {
        super(phone);
    }

    @Override
    public void call() {
        System.out.println("套上个海贼王手机壳");
        super.call();
       
    }
}

客户端调用 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Phone phone = new Huawei();
        phone = new Doraemon(phone);
        phone = new OnePiece(phone);
        phone.call();

    }
}

 输出

 

一个简单的装饰者模式就实现了.

  • 在Android中,Context就可以看做是一个Component(被装饰者基类)
public abstract class Context {
      ......
      
    public abstract void startActivity(@RequiresPermission Intent intent);

    public abstract void startActivity(Intent var1);

    public abstract void startActivity(Intent var1, Bundle var2);

    public abstract void startActivities(Intent[] var1);
      ......
}
  • 而这个被装饰者的具体实现类就是ContextImpl了
public final class ContextImpl extends Context {
    @Override
    public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
        ......
    }
 
    @Override
    public void startActivities(Intent[] intents) {
       ......
    }

    @Override
    public ContentResolver getContentResolver() {
       ......
    }

    @Override
    public Looper getMainLooper() {
      ......
    }

    @Override
    public Context getApplicationContext() {
        ......
    }

}
  • 而ContextThemeWrapper就相当于Decorator(装饰者的基类)了
public class ContextThemeWrapper extends ContextWrapper {

    public ContextWrapper(Context base) {
       ......
    }

    public void startActivity(Intent intent) {
       ......
    }
       ......
}

我们看到,在ContextThemeWrapper保持了一个对Context的引用 

public class Activity extends ContextThemeWrapper implements... {

    public ContextThemeWrapper() {
        super((Context)null);
        ...
    }

    public ContextThemeWrapper(Context base, int themeResId) {
        super((Context)null);
        ...
    }

    public ContextThemeWrapper(Context base, Theme theme) {
        super((Context)null);
        ...
    }
        ...
}
  • 而Activity、Service等就是装饰者了
public class Activity extends ContextThemeWrapper implements...{

        ...
}

 

 

 

 

 

 

 

 

 

 

 

 

  • OK,装饰者模式就简单的说到这里了,欢迎大家指正. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值