<JAVA>Decorator模式

装饰者模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

概述

对类增加功能时,不使用继承,而是使用组合的方式进行类的扩展。装饰模式动态将扩展功能附加到对象上,提供了比继承更有弹性的替代方案。

作用

在不修改类代码的情况下,实现类的扩展,即类对扩展开放,对修改关闭。

优势

可以避免因继承而产生的类过多的问题,这种设计在同一个类体系下非常有效。

格式

需要扩展功能时,只需要设计一个扩展类,该类将原有的类对象作为参数引入,并加以功能的扩展即可。而利用多态特性,可以支持同一个类体系下所有类对象的装饰。

装饰模式与继承的区别

  • 装饰模式比继承要灵活,避免了继承体系的臃肿。
  • 装饰类因为增强已有类,只是在原有功能上进行扩展,所以装饰类和被装饰的类通常都是属于一个体系。
  • 类间关系:前者组合关系,后者继承关系。
  • 继承适用范围更广,而装饰模式更加灵活。

 

 

举个例子吧:

假如说你要找一个男票,你会有很多要求,例如喜欢高、富、帅,喜欢聪明的、喜欢成熟的、喜欢嫩的,各种要求都可能出现......

现在如果你已经有了一个啥都不会的普通男票,你想把他定制成什么样呢?让我们用代码来看一下.

 

/**
 * -->接口
 * 朋友
 *
 */

public interface Friend {
	public String description();
	public Double price();
}


 


/**
 * 
 *一只啥也不会的男朋友
 *
 */

public class BF implements Friend {

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return "一只啥都不会的男票";
	}

	@Override
	public Double price() {
		// TODO Auto-generated method stub
		return 0.001;
	}

}

 

/**
 * 男朋友属性拓展类,
 * 前提拓展之前它也必须是一只男朋友
 *
 */

public class Decorator implements Friend{
	private Friend friend;
	public Decorator(Friend friend) {
		// TODO Auto-generated constructor stub
		this.friend=friend;
	}



	@Override
	public String description() {
		// TODO Auto-generated method stub
		return friend.description();
	}

	@Override
	public Double price() {
		// TODO Auto-generated method stub
		return friend.price();
	}

}



 

/**
 * 
 * +帅气属性男朋友
 *
 */

public class HandsomeDecorator extends Decorator{
	

	public HandsomeDecorator(Friend friend) {
		super(friend);
	}
	@Override
	public String description() {
		// TODO Auto-generated method stub
		return super.description()+"+帅气属性";
	}
	@Override
	public Double price() {
		// TODO Auto-generated method stub
		return super.price()+100;
	}
	

	
}


 

/**
 * 
 * +聪明属性男朋友
 *
 */

public class CleverDecorator extends Decorator {

	public CleverDecorator(Friend friend) {
		super(friend);
		// TODO Auto-generated constructor stub
	}
	@Override
	public String description() {
		// TODO Auto-generated method stub
		return super.description()+"+聪明属性";
	}
	@Override
	public Double price() {
		// TODO Auto-generated method stub
		return super.price()+100;
	}

}


 

public class Test {
public static void main(String[] args) {
	//创建一个男朋友对象
	BF bf=new BF();
	HandsomeDecorator handsome=new HandsomeDecorator(bf);
	System.out.println("您定制了"+handsome.description()+",您可以带他出去溜溜了!");
	System.out.println("您需要支付:"+handsome.price()+"元");
}
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值