簡言:
Java中的23種設計模式:
Factory(工廠模式),Singleton(單例模式),Adapter(適配器模式),FactoryMethod(工廠方法模式),Prototype(原始模型模式),Facade(門面模式),Bridge(橋樑模式),Composite(合成模式),Builder(建造模式),Decorator(裝飾模式),Flyweight(享元模式),Proxy(代理模式),Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),TemplateMethod(模板方法模式),ChainOfResponsibleity(責任鏈模式)
我們在開發中都會用到哪些設計模式呢?
每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重複相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。
今天我們主要講的是裝飾模式
定義:動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活;
裝飾模式的結構圖(網上查找的,流程關係比較詳細)
1) Component定義一個對象接口,可以給對象動態的添加職責
2)ConcreteComponent 定義了一個具體的對象,可以給對象添加一些職責
3) Decorator :裝飾抽象類。繼承Component類並擴展功能,
4) ConcreteDecorator :具體的裝飾對象
我們通過一個案例與代碼的配合講解裝飾模式
案例講解:小草要去相親,如何搭配自己的穿搭,讓她相親的女神相中自己:
1)定義抽象類(Person)爲了展示給女神
public abstract class Person {
public abstract void show();
}
2)定義Compinent類繼承Person(介紹小草的風格)
public class Component extends Person {
@Override
public void show() {
System.out.println("小草的風格");
}
}
3) 定義一個Finery類 繼承自ComPinent類(如何的裝扮自己讓女神愛上自己)
public class Finery extends Component {
private Component component;
/**
* 裝扮自己
設置 Component
* */
public void DecoratorMy(Component components){
this.component = components;
}
// 重寫show() 實際執行的是Person的show();
@Override
public void show() {
if(component != null){
component.show();
}
}
}
4)各種的穿衣風格
class DustCoat extends Finery{
@Override
public void show() {
super.show();
System.out.println("風衣");
}
}
public class fleece extends Finery{
@Override
public void show() {
super.show();
System.out.println("衛衣");
}
}
public class shirt extends Finery{
@Override
public void show() {
super.show();
System.out.println("襯衫");
}
}
class Tshirts extends Finery{
@Override
public void show() {
super.show();
System.out.println("T恤");
}
}
public class Western extends Finery{
@Override
public void show() {
super.show();
System.out.println("西服");
}
}
5)展示給女神(客戶端實現)
public static void main(String[] args) {
System.out.println("\n第一種裝扮");
Component person = new Component();
HipHop hipHop = new HipHop();
fleece fleece = new fleece();
hipHop.DecoratorMy(person);
fleece.DecoratorMy(hipHop);
fleece.show();
System.out.println("\n第二種裝扮");
Western western = new Western();
shirt shirt = new shirt();
DustCoat dustCoat = new DustCoat();
western.DecoratorMy(person);
shirt.DecoratorMy(western);
dustCoat.DecoratorMy(shirt);
dustCoat.show();
}
6)相親成功 顯示結果
案例中:裝飾模式是利用
對對象進行包裝的,這樣每個裝飾對象的實現就和如何使用這個對象分離了,每個裝飾對象關係的是自己的功能。不需要關係如何被添加到對象連當中;
如果只有一個ConcreteCompinent類沒有抽象的Compinent類,nameDecorator類可以使ConcreteComponent的一個子類,同樣道如果只有一個ConcreteDecorator類,那麼久沒有必要建立一個單獨的Decorator類,而可以把Decorartor和ConceteDecorator的責任合併成一個類
裝飾模式的總結:
裝飾模式是爲了已有功能動態的添加更多功能的一種方式,當系統需要新功能的時候,向就得類中添加新的代碼,這些新的代碼通常裝飾了原有類的核心職責,裝飾模式是提供了一個非常好的解決方案,把每個要裝飾的功能放在單獨的類中,並讓這個類包裝她所要裝飾的對象,在需要特殊行爲時,客戶端代碼就可以運行時根據需要選擇的使用裝飾功能包裝對象了
裝飾模式的優點:
優點:把類中的裝飾功能從類中移除,這樣簡化原有的類,有限地把累的核心職責和裝飾功能分離。並去除相關的重複裝飾邏輯,