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