设计模式之装饰者模式

装饰(Decorator)模式又叫做包装模式。通过一种对客户短透明的方式扩展对象的功能,是继承关系的一个替换方案。

抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口。

具体组件角色:为抽象组件的实现类。

抽象装饰角色:包含一个组件的应用,并定义了与抽象组件一致的接口。

具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰。

例子:

抽象组件角色Car:

1 package com.Design.Decorator1;
2 
3 public interface Car {
4     
5     public void show();
6     
7     public void run();
8     
9 }
View Code

具体组件角色RunCar(实现基本的功能):

 1 package com.Design.Decorator1;
 2 
 3 public class RunCar implements Car {
 4 
 5     @Override
 6     public void show() {
 7         this.run();
 8     }
 9 
10     @Override
11     public void run() {
12         System.out.println("可以跑");
13     }
14 
15 }
View Code

抽象装饰角色CarDecorator:

 1 package com.Design.Decorator1;
 2 
 3 public abstract class CarDecorator implements Car{
 4     
 5     private Car car;
 6     
 7     public CarDecorator(Car car){
 8         this.car = car;
 9     }
10     
11     public abstract void show();
12 
13     public Car getCar() {
14         return car;
15     }
16 
17     public void setCar(Car car) {
18         this.car = car;
19     }
20     
21     
22     
23 }
View Code

具体装饰角色FlyCarDecorator:

 1 package com.Design.Decorator1;
 2 
 3 public class FlyCarDecorator extends CarDecorator{
 4 
 5     public FlyCarDecorator(Car car) {
 6         super(car);
 7     }
 8 
 9     @Override
10     public void show() {
11         this.getCar().show();
12         this.fly();
13     }
14     
15     public void fly(){
16         System.out.println("可以飞");
17     }
18 
19     @Override
20     public void run() {
21         
22     }
23     
24 }
View Code

具体装饰角色SwimCarDecorator:

 1 package com.Design.Decorator1;
 2 
 3 public class SwimCarDecorator extends CarDecorator {
 4 
 5     public SwimCarDecorator(Car car) {
 6         super(car);
 7     }
 8 
 9     @Override
10     public void show() {
11         this.getCar().show();
12         this.swim();
13     }
14     
15     public void swim(){
16         System.out.println("可以游");
17     }
18 
19     @Override
20     public void run() {
21         
22     }
23 
24 }
View Code

总结:首线抽象组件角色定义基本功能,然后用一个实现一个基本的组件角色。这个基本的组件角色拥有基本功能。当基本的组件角色的功能不能满足时,那么就在基本功能组件角色的基础上进行增加功能,也就是装饰了;于是,需要一个装饰类,这个装饰类需要持有这个基本组件角色,然后对其装饰,具体实现又可以用具体的装饰角色来实现。

java I/O流中就用到装饰者模式(研究之后,在续写)。

 

posted @ 2018-03-25 20:12  花雪依蒿  阅读(133)  评论(0编辑  收藏  举报