装饰模式: 把所需的功能按正确的顺序串联起来 动态的给一个对象添加一些职责
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 class Person { public Person () { } private string name; public Person (string name ) { this .name = name; } public virtual void Show () { Console.Write("{0}穿着" , name); } } class Finery : Person { protected Person component; public void Decorate (Person component ) { this .component = component; } public override void Show () { component?.Show(); } } class TShirts : Finery { public override void Show () { base .Show(); Console.Write("T恤 " ); } } class BigTrouser : Finery { public override void Show () { base .Show(); Console.Write("垮裤 " ); } } class Silpper : Finery { public override void Show () { base .Show(); Console.Write("拖鞋 " ); } } Person ps = new Person("小明" ); BigTrouser bt = new BigTrouser(); TShirts ts = new TShirts(); Silpper s = new Silpper(); bt.Decorate(ps); ts.Decorate(bt); s.Decorate(ts); s.Show();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 public interface Shape { void draw () ; } public class Rectangle implements Shape { @Override public void draw () { System.out.println("Shape: Rectangle" ); } } public class Circle implements Shape { @Override public void draw () { System.out.println("Shape: Circle" ); } } public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator (Shape decoratedShape) { this .decoratedShape = decoratedShape; } public void draw () { decoratedShape.draw(); } } public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator (Shape decoratedShape) { super (decoratedShape); } @Override public void draw () { decoratedShape.draw(); setRedBorder(decoratedShape); } private void setRedBorder (Shape decoratedShape) { System.out.println("Border Color: Red" ); } } public class DecoratorPatternDemo { public static void main (String[] args) { Shape circle = new Circle (); ShapeDecorator redCircle = new RedShapeDecorator (new Circle ()); ShapeDecorator redRectangle = new RedShapeDecorator (new Rectangle ()); System.out.println("Circle with normal border" ); circle.draw(); System.out.println("\nCircle of red border" ); redCircle.draw(); System.out.println("\nRectangle of red border" ); redRectangle.draw(); } }