《大話設計模式》閱讀筆記和總結。原書是C#編寫的,本人用Java實作了一遍,包括每種設計模式的UML圖實作和示例代碼實作。
目錄:
設計模式 Github位址: DesignPattern
說明
定義:裝飾模式(Decorator)動态地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
UML圖:

裝飾模式UML圖.png
代碼實作:
Component類
abstract class Component {
public abstract void operation();
}
ConcreteComponent類
class ConcreteComponent extends Component{
@Override
public void operation() {
System.out.println("具體對象的操作");
}
}
Decorator類
abstract class Decorator extends Component{
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
// 重寫operation(),實際上執行的是Component的operation()
if (component!=null){
component.operation();
}
}
}
ConcreteDecorator 具體實作類
class ConcreteDecoratorA extends Decorator{
//本類的獨有功能,以差別于ConcreteDecoratorB
private String addedState;
@Override
public void operation() {
super.operation();
addedState = "New State";
System.out.println("具體裝飾對象A的操作");
}
}
class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
AddBehavior();
System.out.println("具體裝飾對象B的操作");
}
//本類的獨有方法,以差別于ConcreteDecoratorA
private void AddBehavior(){
}
}
用戶端代碼
public class DecoratorPattern {
public static void main(String[] args){
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
/*
裝飾的方法是:首先用ConcreteComponent執行個體化對象c,然後用
ConcreteDecoratorA的執行個體化對象d1來包裝c,再用ConcreteDecoratorB
的對象d2包裝d1,最終執行d2的operation()
*/
d1.setComponent(c);
d2.setComponent(d1);
d2.operation();
}
}
運作結果
具體對象的操作
具體裝飾對象A的操作
具體裝飾對象B的操作
示例
例子:之前玩QQ空間的時候,總會裝扮空間,打扮形象,可以給qq的角色搭配各種衣服。用程式模拟這個裝扮的過程。
裝飾模式示例UML圖.png
People類,ConcreteComponent
public class People extends Component{
public People(){}
private String name;
public People(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("裝飾的是"+name);
}
}
服飾類 Decorator
public class Finery extends People {
protected People component;
//打扮
public void Decorate(People component) {
this.component = component;
}
@Override
public void operation() {
if (component!=null){
component.operation();
}
}
}
具體服飾類-T恤 ConcrteFecorator
public class TShirts extends Finery {
@Override
public void operation() {
System.out.print("TShirts");
super.operation();
}
}
具體服飾類-垮褲 ConcrteFecorator
public class BigTrouser extends Finery {
@Override
public void operation() {
System.out.print("垮褲");
super.operation();
}
}
public class Main {
public static void main(String[] args){
People xiaocheng = new People("小成");
System.out.println("第一種裝扮:");
TShirts tShirts = new TShirts();
BigTrouser bigTrouser = new BigTrouser();
tShirts.Decorate(xiaocheng);
bigTrouser.Decorate(tShirts);
bigTrouser.operation();
}
}
第一種裝扮:
垮褲TShirts裝飾的是小成