前言
装饰模式又叫包装模式,字如其意,就是把一个事物包装起来,增加一些修饰物,动态的给一个对象添加一些额外的指责,这和继承有异曲同工的意思,对于增加一些功能来说,装饰模式比写子类来的爽快,这样说来平时随手都是装饰模式,随便来段代码:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
initTitle();
initData();
initOnClickListener();
((BaseActivity) this.getActivity()).setCurrentVisiableFragment(this);
}
这里面就用到了装饰模式,新增方法就是起到了修饰作用。
适用场景
这个很明显了,就是需要动态的去扩展类的方法,需要综合分析一下,继承和装饰谁更适合。
角色扮演
Component:抽象组件,可以是一个接口也可以是抽象类,就是装饰的原始对象。
ConcreteComponent:组件类的实现类,就是基本实现,其实也就是具体对象。
Decorator:抽象装饰类,其职责是装饰原始对象。只有一个具体实现类的时候,可以省略这个抽象类。
ConcreteDecorator:装饰者具体实现类,只是对抽象借口的具体实现。
Demo
抽象一个简单的过程:项目组有两个产品经理,然后一些程序员,下面来演示一个项目开发到结束的过程,首先我们抽象出Component:
package com.demo.decorator;
/**
* Created by italkbb on 2017/12/29.
*/
public abstract class Project {
/**
* Project里面所有人都要工作
*/
public abstract void doWork();
}
程序员 ConcreteComponent:
package com.demo.decorator;
/**
* Created by italkbb on 2017/12/29.
*/
public class Coder extends Project {
@Override
public void doWork() {
doCoding();
}
private void doCoding() {
System.out.println("编码");
}
}
然后手机产品经理,为了突出问题我们写两个产品经理:
package com.demo.decorator;
/**
* Created by italkbb on 2017/12/29.
*/
public abstract class Manager extends Project {
private Project projcet;
public Manager(Project projcet){
this.projcet = projcet;
}
@Override
public void doWork() {
earlyWork();
projcet.doWork();
endWork();
}
/**
* 管理者要在编码前需求之类的
*/
protected abstract void earlyWork();
/**
* 管理者要在编码后做收尾工作
*/
protected abstract void endWork();
}
具体的实现类(ConcreteDecorator):
package com.demo.decorator;
/**
* Created by italkbb on 2017/12/29.
*/
public class ManagerA extends Manager {
public ManagerA(Project projcet) {
super(projcet);
}
@Override
protected void earlyWork() {
System.out.println("经理A做需求分析");
System.out.println("经理A找个项目框架");
System.out.println("经理A详细设计");
}
@Override
protected void endWork() {
}
}
package com.demo.decorator;
/**
* Created by italkbb on 2017/12/29.
*/
public class ManagerB extends Manager {
public ManagerB(Project projcet) {
super(projcet);
}
@Override
protected void earlyWork() {
}
@Override
protected void endWork() {
System.out.println("经理B做收尾工作");
}
}
后期再以一个activity装饰模式来使用我们的demo:
package com.demo.decorator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import teltplay.example.com.kotlindemo.R;
public class DecoratorActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDate();
initView();
}
/**
* 加载数据
*/
private void initDate() {
Project coder = new Coder(); //代码工人
Project managerA = new ManagerA(coder); //项目经理
Project managerB = new ManagerB(coder); //项目经理
// 项目经理开启项目开发
managerA.doWork();
managerB.doWork();
}
/**
* 初始化界面
*/
private void initView() {
setContentView(R.layout.activity_decorator);
}
}
这样简单的装饰模式就完成了。
后记
装饰者模式替代了继承关系,简化了程序结构,为其装饰的对象增强功能,可能会和代理模式混淆,但是代理模式是对代理的对象完成控制,但不会对本身的功能进行强化。