java常用設計模式10—裝飾模式
阿新 • • 發佈:2018-12-04
我的設計模式學習系列專案地址:
GitHub - GodisGod/DesignPatternStudy: 設計模式學習demo
https://github.com/GodisGod/DesignPatternStudy
介紹:
裝飾模式也稱為包裝模式,結構型設計模式之一。
基本框架:
1、需要一個抽象方法類
2、需要一個抽象裝飾器類
3、建立裝飾器
程式碼示例:
1、建立抽象方法類和具體實現類
/**
* 抽象方法類
*/
public abstract class Component {
/**
* 抽象方法
*/
public abstract void operate();
}
/**
* 未經裝飾的元件實現類
*/
public class ConcreteComponent extends Component {
@Override
public void operate() {
//具體邏輯
Log.i("LHD", "元件具體邏輯");
}
}
2、然後建立抽象裝飾器類和具體裝飾器類
/**
* 裝飾器抽象類
*/
public class Decorator extends Component {
private Component component; //持有一個Component物件的引用
/**
* 將Component物件傳給裝飾器
*
* @param component
*/
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
//呼叫元件的具體方法
component.operate();
}
}
/**
* 具體裝飾器A
*/
public class RealDecoratorA extends Decorator {
/**
* 將Component物件傳給裝飾器
*
* @param component
*/
public RealDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
operate1();//裝飾方法可以在父類方法之前呼叫也可以在之後呼叫
super.operate();//呼叫具體的元件方法
operate2();
}
/**
* 裝飾方法1
*/
private void operate1() {
Log.i("LHD", "A裝飾器1");
}
/**
* 裝飾方法2
*/
private void operate2() {
Log.i("LHD", "A裝飾器2");
}
}
/**
* 具體裝飾器B
*/
public class RealDecoratorB extends Decorator {
/**
* 將Component物件傳給裝飾器
*
* @param component
*/
public RealDecoratorB(Component component) {
super(component);
}
@Override
public void operate() {
operate1();//裝飾方法可以在父類方法之前呼叫也可以在之後呼叫
super.operate();
operate2();
}
/**
* 裝飾方法1
*/
private void operate1() {
Log.i("LHD","B裝飾器1");
}
/**
* 裝飾方法2
*/
private void operate2() {
Log.i("LHD","B裝飾器2");
}
}
3、我們建立了兩個裝飾器A和B,接下來我們使用裝飾器裝飾元件
//構造需要被裝飾的元件物件
Component component = new ConcreteComponent();
//構造裝飾器A,呼叫裝飾器A的方法裝飾元件物件
RealDecoratorA realDecoratorA = new RealDecoratorA(component);
realDecoratorA.operate();
//構造裝飾器B,呼叫裝飾器B的方法裝飾元件物件
RealDecoratorB realDecoratorB = new RealDecoratorB(component);
realDecoratorB.operate();
檢視輸出:
可以看到裝飾器的原理就是把要裝飾的物件傳給裝飾器,然後裝飾器內部呼叫一些裝飾方法。如果裝飾器需要操作Component物件,只需要將裝飾器抽象類的private Component component;改為public Component component;即可。此處不再示例。
然後我們看一個具體的裝飾器的使用例子:
汽車工廠生產汽車,寶馬和法拉利的生產流程並不相同,我們用裝飾器模式實現這個場景。
1、建立生產汽車的抽象類和生產汽車的實現類
/**
* 抽象方法類
*/
public abstract class Component {
/**
* 抽象方法
*/
public abstract void operate();
}
/**
* 未經裝飾的汽車工廠
*/
public class CarFactory extends Component {
@Override
public void operate() {
Log.i("LHD", "安裝汽車發動機");
}
}
2、建立抽象車廠裝飾類和具體的寶馬車廠和法拉利車廠
/**
* 抽象車廠裝飾類
*/
public class FactoryDecorator extends Component{
//保持一個基本元件的引用
protected Component component;
public FactoryDecorator(Component component) {
this.component = component;
}
@Override
public void operate() {
//呼叫基本元件的方法
component.operate();
}
}
/**
* 寶馬車汽車廠
*/
public class BMW extends FactoryDecorator {
public BMW(Component component) {
super(component);
}
@Override
public void operate() {
installCarTyre();//安裝車標
super.operate();//安裝發動機
installCarLogo();//安裝汽車logo
}
/**
* 安裝車標
*/
private void installCarLogo() {
Log.i("LHD", "安裝寶馬車標");
}
/**
* 安裝輪胎
*/
private void installCarTyre() {
Log.i("LHD", "安裝寶馬車輪胎");
}
}
/**
* 法拉利裝飾器
*/
public class Ferrari extends FactoryDecorator{
public Ferrari(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();//安裝發動機
installCarLogo();//安裝汽車logo
installCarTyre();//安裝車標
}
/**
* 安裝車標
*/
private void installCarLogo() {
Log.i("LHD", "安裝法拉利車標");
}
/**
* 安裝輪胎
*/
private void installCarTyre() {
Log.i("LHD", "安裝法拉利輪胎");
}
}
好啦!接下來我們就可以生產汽車啦 (^ ▽ ^)
//安裝上汽車發動機了
CarFactory carFactory = new CarFactory();
//讓寶馬車廠加工
BMW bmw = new BMW(carFactory);
bmw.operate();
//或者讓法拉利車廠加工
Log.i("LHD","--------------法拉利車廠--------------");
Ferrari ferrari = new Ferrari(carFactory);
ferrari.operate();
執行輸出:
可以看到輸出和我們預先設計的一樣呢,以上就是裝飾模式的簡單介紹啦! (^ ▽ ^)