0%

设计模式-装饰模式

装饰模式:
把所需的功能按正确的顺序串联起来
动态的给一个对象添加一些职责

示例

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("拖鞋 ");
}
}
//Client

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();
/*
小明穿着垮裤 T恤 拖鞋
*/

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
//java示例
//接口
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");
}
}
//Client
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());
//Shape redCircle = new RedShapeDecorator(new Circle());
//Shape 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();
}
}
/*
Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red
*/