设计模式之-----装饰者模式

今天学习了设计模式里的装饰者模式,所谓的装饰模式,顾名思义,就是将一个对象层层装饰,就如同人穿衣服一样,由内到外,衣服要一层一层的穿好,才能出门,对象也是一样,对象经过层层包装,最后包装好的对象,才是我们最后想要的。

引用百度百科的一句话: 装饰者模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

用一个例子,更能说明其作用。

(注:本例子是引用了博主为:java_my_life中使用的例子,同时对原来的例子做了很小的变动,特此声明一下,原文链接:装饰模式

首先,包结构如下


这个例子是根据齐天大圣能进行72变化进行的例子,首先定义一个通用的接口,也就是说,不管齐天大圣怎么变,都会有的一个属性,那就是移动。所以,新建接口

package com.wrapper.component;

public interface TheGreatestSage {

	public void move();
}

接口新建完之后,当然就是写一个实现类了,齐天大圣的真身,即没有任何包装的时候,是一只猴子,那么,就新建一个猴子类

package com.wrapper.concrete.component;

import com.wrapper.component.TheGreatestSage;

public class Monkey implements TheGreatestSage {

	public void move() {
		System.out.println("Monkey移动");
	}

}

这个猴子类实现了之前的接口方法,很简单,现在的猴子没有任何包装,只是单独的一只猴子而已。

不久之后,猴子遇见了师父,师父要教他72变,所以定义一个change类

package com.wrapper.decorator;

import com.wrapper.component.TheGreatestSage;

public class Change implements TheGreatestSage {

	private TheGreatestSage sage;

	public Change(TheGreatestSage sage) {
		this.sage = sage;
	}

	
	public void move() {
		sage.move();
	}

}

要注意这个change类也要继承接口,因为不管猴子怎么变,接口中的move方法是他本身的属性,不会丢失的。

之后就是具体的变什么了,首先要变成一只小鸟,

package com.wrapper.concrete.decorator;

import com.wrapper.component.TheGreatestSage;
import com.wrapper.decorator.Change;

public class Bird extends Change{

	public Bird(TheGreatestSage sage) {
        super(sage);
    }

    @Override
    public void move() {
    	super.move();
        System.out.println("Bird Move");
    }
}

这里的move方法要注意了,它首先要调用父类的方法,然后调用自己的,否则就和普通的继承没有区别了。

同样的,还有鱼类

package com.wrapper.concrete.decorator;

import com.wrapper.component.TheGreatestSage;
import com.wrapper.decorator.Change;

public class Fish extends Change {

	public Fish(TheGreatestSage sage) {
        super(sage);
    }

    @Override
    public void move() {
    	super.move();
        System.out.println("Fish Move");
    }
}

最后的测试类

package com.wrapper.main;

import com.wrapper.component.TheGreatestSage;
import com.wrapper.concrete.component.Monkey;
import com.wrapper.concrete.decorator.Bird;
import com.wrapper.concrete.decorator.Fish;

public class Client {

	 public static void main(String[] args) {
	        TheGreatestSage sage = new Monkey();
	        // 第一种写法
	        TheGreatestSage bird = new Bird(sage);
	        TheGreatestSage fish = new Fish(bird);
	        // 第二种写法
	        //TheGreatestSage fish = new Fish(new Bird(sage));
	        fish.move(); 
	    }

}


这样,一个装饰者模式就ok了,通过在声明的时候传递进不同的对象,将对象层层包装,最后得到我们想要的结果。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值