JAVA设计模式之装饰者模式

    装饰者模式,简单的说就是动态的将“职责”添加到已有的对象中,实现功能的拓展。在装饰者模式中,新建子类,不断的继承父类,并添加的新的属性,在新的子类中,需要将当前父类的对象传递进去才会实现,既有之前父类拥有的“职责”,也有新建的“职责”。

    简单的举个例子:我想要个女朋友,这个时候表达出来的只有一个属性,女的。光是女的还不够,我还想是一个美国女孩,现在就多了一个属性,美国的。美国的女孩有什么特点呢?金发!现在又多了一个属性,金发。西方人一般都比东方人高大一点。所以再添加一个高大的属性。那么现在就是这个情况“女孩 + 美国的 + 金发 + 高大”。下面我们通过一个列子,来体现出动态添加属性,也就是装饰者模式。

    首先创建一个抽象类Girl

public abstract class Girl {
	String description = "no description";
	public String getDescription() {
		return description;
	}
}
    女孩有了,现在需要的是一个美国女孩
public class AmericanGirl extends Girl{
	public AmericanGirl() {
		description = "+ AmericanGirl";
	}
}

    为了对比,我们再创建一个国产妹子

public class ChineseGirl extends Girl {
	public ChineseGirl() {
		description = "+ ChineseGirl";
	}
}

    接下来,就是装饰者了,这个装饰者继承了Girl这个抽象类,后面为女孩添加属性的时候,就继承这个装饰者,就有女孩这个属性了。

public abstract class GirlDecorator extends Girl{
	public abstract String getDescription();
}

    有了美国女孩,我们再为她添加上金发,注意看这儿的代码,在类中,创建了一个Girl,并且在构造方法中,实现赋值了,这就说明我们在使用的时候,需要传递一个Girl对象进来,这个Girl对象拥有之前的数属性,传递进来后,我们就在这里面动态的添加新的属性,比如说金发。

public class GoldenHair extends GirlDecorator {

	private Girl girl;
	public GoldenHair(Girl g) {
		girl = g;
	}
	public String getDescription() {
		return girl.getDescription() + " + with golde hair";
	}
}

    还有最后一个属性,身材高大.....这个类和上一个金发的一样,只是我们添加的属性不同。

public class Tall extends GirlDecorator{
	private Girl girl;
	public Tall(Girl g) {
		girl = g;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return girl.getDescription() + "+ is tall";
	}
	
} 

    现在到最后一步,我们来测试一下。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Girl g1 = new AmericanGirl();
		System.err.println(g1.getDescription());
		GoldenHair g2 = new GoldenHair(g1);
		System.out.println(g2.getDescription());
		Tall g3 = new Tall(g2);
		System.out.println(g3.getDescription());
	}

}

    观察代码,我们首先创建了一个父类引用的子对象,这里创建一个Gril对象是为了方便后面的使用。接着是创建一个金发的女孩,但是金发的女孩是美国的,就将之前创建的美国女孩作为参数传递进去,那么现在就是“美国+金发”了。最后同样的道理,我们为她添加身材高大的属性,这样就有了“美国 + 金发 + 高大”的女孩了。

    装饰者模式的重点就是:在构造方法中将已有的父类对象传递进去,传递进去后,依旧拥有父类的属性或者职责,然后再在新的子类中,添加的新的属性。

    以上只是我个人的理解,如果发现有不对的地方清指出,谢谢。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohuiyang_949/article/details/79956970
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭