结构型模式-装饰模式

装饰模式

装饰模式是对类的组合进行的扩充。
比如现在有个门,现在有一些额外功能,比如"添加锁" “贴春联” “门眼” “门框全包” 等功能,这些功能可以单独存在,也可以两两组合等随意组合。
怎么实现这样的"门"呢.

  1. 继承:比如有“贴春联” “门眼” 就添加一个新类,这样如果需要其他的功能就需要无穷多的子类。
  2. 组合:加强版组合—装饰模式
    功能可以随意定义,随意组合,只需要一些特定的装饰类。

特点: 抽象装饰角色和要装饰的类(具体角色)继承同样的接口(抽象角色)

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();
	}
}

起床了,要床衣服!!
穿个衬衫
穿个西服
鞋子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值