定义
在不更改原来对象的情况下,新增功能,此模式属于结构型模式。
应用场景
一个类需要拓展新的功能
优点
1.不改变原来对象的情况下添加了新的功能 2.使用不同的组合实现不同的结果 3.类和装饰类解偶
缺点
可能会有很多层装饰
具体代码实现
例子说明:手机有很多功能,这些功能是随时代科技发展不断叠加的,那么手机用途作为一个类,然后不断给手机用户添加新的功能。
手机用途接口
package com.elaine.testpattern.decorator;
/**
* 手机用途
*
* author: elaine
* date: 2021/4/23
*/
public interface PhoneUse {
void use();
}
基础功能 打电话
package com.elaine.testpattern.decorator;
import android.util.Log;
/**
* 手机基础功能---打电话
* author: elaine
* date: 2021/4/23
*/
public class CallUse implements PhoneUse {
@Override
public void use() {
Log.e("use====", "打电话");
}
}
手机用途装饰器
package com.elaine.testpattern.decorator;
/**
* 用处装饰器
*
* author: elaine
* date: 2021/4/23
*/
public abstract class UseDecorator implements PhoneUse {
PhoneUse phoneUse;
public UseDecorator(PhoneUse phoneUse) {
this.phoneUse = phoneUse;
}
}
新增用途
计算
package com.elaine.testpattern.decorator;
import android.util.Log;
/**
* 计算功能
* <p>
* author: elaine
* date: 2021/4/23
*/
public class CalculateUse extends UseDecorator {
public CalculateUse(PhoneUse phoneUse) {
super(phoneUse);
}
@Override
public void use() {
Log.e("use===", "计算");
phoneUse.use();
}
}
拍照
package com.elaine.testpattern.decorator;
import android.util.Log;
/**
* 拍照功能
* author: elaine
* date: 2021/4/23
*/
public class PhotographUse extends UseDecorator {
public PhotographUse(PhoneUse phoneUse) {
super(phoneUse);
}
@Override
public void use() {
Log.e("use===", "拍照");
phoneUse.use();
}
}
运行代码
private void use() {
//可以拍照打电话计算的手机
PhoneUse phoneUse = new PhotographUse(new CalculateUse(new CallUse()));
phoneUse.use();
}