优点:可以降低系统耦合度,给对象新增功能。
缺点:会产生过多的相似对象,多层装饰情况下比较复杂,层层嵌套,不容易发下问题所在。
例子:比如给一个普通手机,我得建一个类,我需要添加指纹解锁又得建一个类,添加人脸识别又要一个类,如果需要人脸识别以及指纹解锁都具备的手机又得添加一个类,这样的类膨胀对维护很不好,这种情况下可以使用装饰模式,对它们进行任意组合,装饰模式需要以下4个角色。
- Component:抽象构件,让真实对象和装饰对象拥有相同的接口。
- ConcreteComponent:具体构件角色,也就是真实对象。
- Decorator:装饰角色,持有一个抽象构件的引用。
- ConcreteDecorator:具体装饰角色,负责给对象增添新的功能。
先创建一个Component(抽象构件):
/**
* 这是一个Component(抽象构件)
* 拥有一个打电话功能
*/
public interface IPhone {
void call();
}
然后创建一个ConcreteComponent(具体构件角色),并实现IPhone 接口:
import android.util.Log;
/**
* 这是一个ConcreteComponent(具体构件角色)
*/
public class Phone implements IPhone {
@Override
public void call() {
Log.d("TAG","打电话");
}
}
然后创建一个装饰器,Decorator(装饰角色),并实现IPhone 接口:
/**
* 这是一个Decorator(装饰角色)
*/
public class SmartPhone implements IPhone {
protected IPhone iPhone;
public SmartPhone(IPhone iPhone) {
this.iPhone = iPhone;
}
@Override
public void call() {
iPhone.call();
}
}
然后添加ConcreteDecorator(具体装饰角色),指纹解锁:
import android.util.Log;
/**
* 这是一个ConcreteDecorator(具体装饰角色)
* 指纹解锁
*/
public class FingerprintUnlockPhone extends SmartPhone {
public FingerprintUnlockPhone(IPhone iPhone) {
super(iPhone);
}
public void fingerprintUnlock() {
Log.d("TAG", "添加了指纹解锁");
}
@Override
public void call() {
super.call();
fingerprintUnlock();
}
}
人脸识别:
import android.util.Log;
/**
* 这是一个ConcreteDecorator(具体装饰角色)
* 人脸识别
*/
public class FaceRecognitionPhone extends SmartPhone {
public FaceRecognitionPhone(IPhone iPhone) {
super(iPhone);
}
public void faceRecognition() {
Log.d("TAG", "添加了人脸识别");
}
@Override
public void call() {
super.call();
faceRecognition();
}
}
该有的角色都有了,调用:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//一个普通手机
Phone phone = new Phone();
phone.call();
//添加了指纹解锁的手机
FingerprintUnlockPhone fingerprintUnlockPhone = new FingerprintUnlockPhone(phone);
fingerprintUnlockPhone.call();
//添加了人脸识别的手机
FaceRecognitionPhone faceRecognitionPhone = new FaceRecognitionPhone(phone);
faceRecognitionPhone.call();
//添加了指纹解锁和人脸识别的手机
FaceRecognitionPhone faceRecognitionPhone2 = new FaceRecognitionPhone(fingerprintUnlockPhone);
faceRecognitionPhone2.call();
}
}
结果:
image.png
很灵活的自由组合方式。
已完成测试!有不对的地方欢迎指出,感恩。
网友评论