装饰模式
装饰模式是对类的组合进行的扩充。
比如现在有个门,现在有一些额外功能,比如"添加锁" “贴春联” “门眼” “门框全包” 等功能,这些功能可以单独存在,也可以两两组合等随意组合。
怎么实现这样的"门"呢.
- 继承:比如有“贴春联” “门眼” 就添加一个新类,这样如果需要其他的功能就需要无穷多的子类。
- 组合:加强版组合—装饰模式
功能可以随意定义,随意组合,只需要一些特定的装饰类。
特点: 抽象装饰角色和要装饰的类(具体角色)继承同样的接口(抽象角色)
1. 抽象角色
package com.hfview.designMode.decorator;
/**
* 抽象的接口
*
*/
public interface People {
void wear();
}
2.具体角色
package com.hfview.designMode.decorator;
/**
*
*具体的对象
*/
public class LiLei implements People {
public void wear() {
System.out.println("起床了,要床衣服!!");
}
}
3.抽象装饰者
package com.hfview.designMode.decorator;
/**
*
*抽象装饰着类
*实现抽象角色接口
*/
public class Decorator implements People {
private People p;//采用组合形式
public Decorator(People p) {
this.p = p;
}
public void wear() {
p.wear();
}
}
4.具体装饰类1
package com.hfview.designMode.decorator;
/**
* 具体装饰者---穿衬衫
* @author Administrator
*
*/
class DecoratorShirt extends Decorator{
public DecoratorShirt(People people) {
super(people);
}
public void wear() {
super.wear();
System.out.println("穿个衬衫");
}
}
5.具体装饰类2
package com.hfview.designMode.decorator;
/**
*
*具体的装饰者类,负责给增加附加的操作:穿西服
*/
class DecoratorSuit extends Decorator{
public DecoratorSuit(People people) {
super(people);
}
public void wear() {
super.wear();
System.out.println("穿个西服");
}
}
5.具体装饰类3
package com.hfview.designMode.decorator;
/**
*
*具体的装饰者类,负责给增加附加的操作:穿鞋子
*/
class DecoratorShoes extends Decorator{
public DecoratorShoes(People people) {
super(people);
}
public void wear() {
super.wear();
System.out.println("鞋子");
}
}
调用实例
package com.hfview.designMode.decorator;
/**
*
*装饰模式有点像静态代理,基本上就是在原来方法的基础上增加一些额外功能
*这个其实也能用继承来实现,但是如果用继承那么将会产生无穷尽的子类,远远不如
*装饰灵活好用。
*/
public class Main {
public static void main(String[] args) {
People p = new LiLei();
People d1 = new DecoratorShirt(p);//第一层装饰
People d2 = new DecoratorSuit(d1);//第二层装饰
People d3 = new DecoratorShoes(d2);//第二层装饰
d3.wear();
}
}
起床了,要床衣服!!
穿个衬衫
穿个西服
鞋子