设计模式-装饰模式(Decorator )

  装饰器在现实场景中很常见:譬如:你搭梯子上楼,一个梯子长度正好 3 米,而二楼刚好三米,这张梯子刚好,可是三楼却有5米高,为了上二楼,我们得把原来的梯子加长2米,刚好,四楼也正好比三楼高了2米,为了上四楼 梯子要得加长2米,而5楼却比四楼高了4米,这样梯子要得加长4米了。这种模式就是装饰模式(Decorator)

看图:

设计图

上代码:

public interface Ladder {
	int height();
}

具体组件:

public class ThreeMeterHighStaircase implements Ladder {
	private final int height = 3;
	
	public int height() {
		return height;
	}

}

装饰组件

public abstract class AbstractLadder implements Ladder {

	private Ladder ladder;
	
	public AbstractLadder(Ladder ladder) {
		this.ladder = ladder;
	}
	
	public AbstractLadder() {
		
	}
	
	public abstract int height();

}

具体组件

public class TwoMeterHight extends AbstractLadder {
	public final int height = 2;
	
	private Ladder ladder;
	
	public TwoMeterHight(Ladder ladder) {
		this.ladder = ladder;
	}

	@Override
	public int height() {
		return ladder.height() + height;
	}
}

使用:

	public static void main(String[] args) {
		ThreeMeterHighStaircase basic = new ThreeMeterHighStaircase();
		belongFloor(basic);
		
		AbstractLadder three = new TwoMeterHight(basic);
		belongFloor(three);
		
		AbstractLadder four = new TwoMeterHight(three);
		belongFloor(three);
		
		AbstractLadder five = new TwoMeterHight(new TwoMeterHight(four));
		belongFloor(five);
	}

	
	public static void belongFloor(Ladder ladder) {
		if(ladder.height() == 3) {
			System.out.println("二楼到了");
		}else if(ladder.height() == 5) {
			System.out.println("三楼到了");
		}else if(ladder.height() == 7) {
			System.out.println("四楼到了");
		}else if(ladder.height() == 11) {
			System.out.println("五楼楼到了");
		}
	}
二楼到了
三楼到了
三楼到了
5楼楼到了

在上一个例子

组件接口

public interface Car {

	public void assemble();
}

组件具体实现:

public class BasicCar implements Car {

	@Override
	public void assemble() {
		System.out.print("Basic Car.");
	}

}

装饰器

public class CarDecorator implements Car {

	protected Car car;
	
	public CarDecorator(Car c){
		this.car=c;
	}
	
	@Override
	public void assemble() {
		this.car.assemble();
	}

}

具体装饰器

public class LuxuryCar extends CarDecorator {

	public LuxuryCar(Car c) {
		super(c);
	}
	
	@Override
	public void assemble(){
		super.assemble();
		System.out.print(" Adding features of Luxury Car.");
	}
}
ublic class SportsCar extends CarDecorator {

	public SportsCar(Car c) {
		super(c);
	}

	@Override
	public void assemble(){
		super.assemble();
		System.out.print(" Adding features of Sports Car.");
	}
}

 测试实现:

public class DecoratorPatternTest {

	public static void main(String[] args) {
		Car sportsCar = new SportsCar(new BasicCar());
		sportsCar.assemble();
		System.out.println("\n*****");
		
		Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
		sportsLuxuryCar.assemble();
	}

}

类图

从两个例子看出 装饰器模式:优势比较明显 要比子类继承更有优势 ,而且更加灵活,当选择数量较多时,易于维护和扩展。装饰器设计模式的缺点是它使用了很多相似类型的对象。装饰器模式在Java IO类中被大量使用,例如FileReader、BufferedReader等

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树懒_Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值