test

Emacs Package


前言
装饰模式又叫包装模式,字如其意,就是把一个事物包装起来,增加一些修饰物,动态的给一个对象添加一些额外的指责,这和继承有异曲同工的意思,对于增加一些功能来说,装饰模式比写子类来的爽快,这样说来平时随手都是装饰模式,随便来段代码:
java
@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:

“`java
package com.demo.decorator;

/**
* Created by italkbb on 2017/12/29.
*/

public abstract class Project {
/**
* Project里面所有人都要工作
*/
public abstract void doWork();
}

程序员 ConcreteComponent:
java
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(“编码”);
}
1
2
3
4
}
“`

然后手机产品经理,为了突出问题我们写两个产品经理:
“`java
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();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
}

“`

具体的实现类(ConcreteDecorator):

“`java
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() {

}
1
2
3
4
5
6
7
8
9
10
11
12
}

“`

“`java
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做收尾工作”);
}
1
2
3
4
5
6
7
8
9
10
}

“`

后期再以一个activity装饰模式来使用我们的demo:

“`java
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
}

“`

这样简单的装饰模式就完成了。

后记

装饰者模式替代了继承关系,简化了程序结构,为其装饰的对象增强功能,可能会和代理模式混淆,但是代理模式是对代理的对象完成控制,但不会对本身的功能进行强化。

相关文章
相关标签/搜索