Skip to content

Commit 82ef96f

Browse files
committed
设计模式-装饰器模式
1 parent 76831cb commit 82ef96f

File tree

8 files changed

+230
-0
lines changed

8 files changed

+230
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.design.decorator;
2+
3+
import com.design.decorator.component.FryNoodleConcreteComponent;
4+
import com.design.decorator.component.NoodleComponent;
5+
import com.design.decorator.component.SoupNoodleConcreteComponent;
6+
import com.design.decorator.decorator.BeefConcreteDecorator;
7+
import com.design.decorator.decorator.FriedEggConcreteDecorator;
8+
import com.design.decorator.decorator.MarinatedEggConcreteDecorator;
9+
10+
/**
11+
* 装饰器模式
12+
* 通过不同的装饰器自由组合
13+
* 我们可以灵活的组装出各式各样的面加配菜
14+
* 这正是装饰者模式的优点
15+
* 但明显可以看出代码变复杂了
16+
*
17+
* @author wliduo[i@dolyw.com]
18+
* @date 2022/1/18 16:05
19+
*/
20+
public class Main {
21+
22+
public static void main(String[] args) {
23+
// 汤面
24+
NoodleComponent soupNoodleConcreteComponent = new SoupNoodleConcreteComponent();
25+
// 加牛肉
26+
soupNoodleConcreteComponent = new BeefConcreteDecorator(soupNoodleConcreteComponent);
27+
// 加煎蛋
28+
soupNoodleConcreteComponent = new FriedEggConcreteDecorator(soupNoodleConcreteComponent);
29+
System.out.println(soupNoodleConcreteComponent.remark());
30+
System.out.println(soupNoodleConcreteComponent.price());
31+
System.out.println("----------------------");
32+
// 炒面
33+
NoodleComponent fryNoodleConcreteComponent = new FryNoodleConcreteComponent();
34+
// 加牛肉
35+
fryNoodleConcreteComponent = new BeefConcreteDecorator(fryNoodleConcreteComponent);
36+
// 加卤蛋
37+
fryNoodleConcreteComponent = new MarinatedEggConcreteDecorator(fryNoodleConcreteComponent);
38+
System.out.println(fryNoodleConcreteComponent.remark());
39+
System.out.println(fryNoodleConcreteComponent.price());
40+
System.out.println("-----------------------");
41+
// 炒面
42+
NoodleComponent fryNoodleConcreteComponentEasy = new FryNoodleConcreteComponent();
43+
// 加牛肉加卤蛋加煎蛋
44+
fryNoodleConcreteComponentEasy =
45+
new BeefConcreteDecorator(
46+
new MarinatedEggConcreteDecorator(new FriedEggConcreteDecorator(fryNoodleConcreteComponentEasy)));
47+
System.out.println(fryNoodleConcreteComponentEasy.remark());
48+
System.out.println(fryNoodleConcreteComponentEasy.price());
49+
}
50+
51+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.design.decorator.component;
2+
3+
/**
4+
* 炒面具体构件
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2022/1/18 16:30
8+
*/
9+
public class FryNoodleConcreteComponent implements NoodleComponent {
10+
11+
@Override
12+
public String remark() {
13+
return "炒面10快";
14+
}
15+
16+
@Override
17+
public Integer price() {
18+
return 10;
19+
}
20+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.design.decorator.component;
2+
3+
/**
4+
* 面条抽象构件
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2022/1/18 16:30
8+
*/
9+
public interface NoodleComponent {
10+
11+
/**
12+
* 备注
13+
*
14+
* @param
15+
* @return java.lang.String
16+
* @throws
17+
* @author wliduo[i@dolyw.com]
18+
* @date 2022/1/18 16:31
19+
*/
20+
String remark();
21+
22+
/**
23+
* 价格
24+
*
25+
* @param
26+
* @return java.lang.Integer
27+
* @throws
28+
* @author wliduo[i@dolyw.com]
29+
* @date 2022/1/18 16:31
30+
*/
31+
Integer price();
32+
33+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.design.decorator.component;
2+
3+
/**
4+
* 汤面具体构件
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2022/1/18 16:30
8+
*/
9+
public class SoupNoodleConcreteComponent implements NoodleComponent {
10+
11+
@Override
12+
public String remark() {
13+
return "汤面8快";
14+
}
15+
16+
@Override
17+
public Integer price() {
18+
return 8;
19+
}
20+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.design.decorator.decorator;
2+
3+
import com.design.decorator.component.NoodleComponent;
4+
5+
/**
6+
* 配菜抽象装饰
7+
*
8+
* @author wliduo[i@dolyw.com]
9+
* @date 2022/1/18 16:40
10+
*/
11+
public abstract class AbstractSideDishDecorator implements NoodleComponent {
12+
13+
private NoodleComponent noodleComponent;
14+
15+
public AbstractSideDishDecorator(NoodleComponent noodleComponent) {
16+
this.noodleComponent = noodleComponent;
17+
}
18+
19+
@Override
20+
public String remark() {
21+
return noodleComponent.remark();
22+
}
23+
24+
@Override
25+
public Integer price() {
26+
return noodleComponent.price();
27+
}
28+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.design.decorator.decorator;
2+
3+
import com.design.decorator.component.NoodleComponent;
4+
5+
/**
6+
* 牛肉具体装饰
7+
*
8+
* @author wliduo[i@dolyw.com]
9+
* @date 2022/1/18 16:44
10+
*/
11+
public class BeefConcreteDecorator extends AbstractSideDishDecorator {
12+
13+
public BeefConcreteDecorator(NoodleComponent noodleComponent) {
14+
super(noodleComponent);
15+
}
16+
17+
@Override
18+
public String remark() {
19+
return super.remark() + " 加份牛肉5快";
20+
}
21+
22+
@Override
23+
public Integer price() {
24+
return super.price() + 5;
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.design.decorator.decorator;
2+
3+
import com.design.decorator.component.NoodleComponent;
4+
5+
/**
6+
* 煎蛋具体装饰
7+
*
8+
* @author wliduo[i@dolyw.com]
9+
* @date 2022/1/18 16:44
10+
*/
11+
public class FriedEggConcreteDecorator extends AbstractSideDishDecorator {
12+
13+
public FriedEggConcreteDecorator(NoodleComponent noodleComponent) {
14+
super(noodleComponent);
15+
}
16+
17+
@Override
18+
public String remark() {
19+
return super.remark() + " 加份煎蛋3快";
20+
}
21+
22+
@Override
23+
public Integer price() {
24+
return super.price() + 3;
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.design.decorator.decorator;
2+
3+
import com.design.decorator.component.NoodleComponent;
4+
5+
/**
6+
* 卤蛋具体装饰
7+
*
8+
* @author wliduo[i@dolyw.com]
9+
* @date 2022/1/18 16:44
10+
*/
11+
public class MarinatedEggConcreteDecorator extends AbstractSideDishDecorator {
12+
13+
public MarinatedEggConcreteDecorator(NoodleComponent noodleComponent) {
14+
super(noodleComponent);
15+
}
16+
17+
@Override
18+
public String remark() {
19+
return super.remark() + " 加份卤蛋2快";
20+
}
21+
22+
@Override
23+
public Integer price() {
24+
return super.price() + 2;
25+
}
26+
}

0 commit comments

Comments
 (0)