标签:nis span end div 动态添加 nbsp rate 亮点 out
是给目标对象添加额外的功能,当然继承也是可以添加额外的功能,但是相对于装饰模式,其就会暴露出不够灵活以及比较臃肿和静态(提前定义好功能在进行重写扩展)的特点。是继承的替代方案
1) 抽象装饰者(只是一个抽象的装饰便于进行装饰的扩展)
2) 具体的装饰者(提供具体的装饰)
3) 抽象被装饰者(需要被装饰的抽象,便于扩展)
4) 具体的被装饰者
1) 给目标对象动态添加扩展功能也可以卸载这个功能
2) 进行多重装饰
3) 进行基本的排列组合
需要实现同一个接口和适配器模式很像,但是适配器模式实现接口是为了调用源接口,从而把源接口转换为目标接口想要的接口进而能够使用接口不一致的方法
而装饰模式是为了实现额外的功能。
package decorate; /** * 被装饰者,也是装饰者实现的接口即统一接口 * @author Administrator * */ public interface Clothes { public String getName(); public String style(); } package decorate; /** * 具体的被装饰类,大衣 * @author Administrator * */ public class OverCoat implements Clothes { @Override public String getName() { // TODO Auto-generated method stub return "大衣"; } @Override public String style() { // TODO Auto-generated method stub return "长款"; }
package decorate; /** * 装饰者 实现 被装饰者进行额外功能的实现 * @author Administrator * */ public abstract class Accessories implements Clothes { private Clothes clothes; Accessories(Clothes clothes){ this.clothes=clothes; } @Override public String getName() { // TODO Auto-generated method stub return clothes.getName(); } @Override public String style() { // TODO Auto-generated method stub return clothes.style(); } }
package decorate; /** * 装饰具体类 丝巾 * @author Administrator * */ public class Silk extends Accessories { Silk(Clothes clothes) { super(clothes); // TODO Auto-generated constructor stub } @Override public String getName() { // TODO Auto-generated method stub return super.getName()+"带上了丝巾"; } @Override public String style() { // TODO Auto-generated method stub return super.style()+"带上了长的丝巾"; } }
package decorate; /** * 装饰具体类 腰带 * @author Administrator * */ public class Belt extends Accessories { Belt(Clothes clothes) { super(clothes); // TODO Auto-generated constructor stub } @Override public String getName() { // TODO Auto-generated method stub return super.getName()+"带上了腰带"; } @Override public String style() { // TODO Auto-generated method stub return super.style()+"带上了红色的腰带"; } }
package decorate; public class testDecorate { public static void main(String[] args) { // TODO Auto-generated method stub Clothes coat=new OverCoat();//大衣 Clothes silk=new Silk(coat);//加上丝巾 Clothes belt=new Belt(coat);//加上腰带 Clothes beltAndSilk=new Belt(new Silk(coat));//既加上了腰带也加上了丝巾 System.out.println(silk.getName()); System.out.println(belt.getName()); System.out.println(beltAndSilk.getName()); System.out.println(silk.style()); System.out.println(belt.style()); System.out.println(beltAndSilk.style()); } }
大衣带上了丝巾
大衣带上了腰带
大衣带上了丝巾带上了腰带
长款带上了长的丝巾
长款带上了红色的腰带
长款带上了长的丝巾带上了红色的腰带
标签:nis span end div 动态添加 nbsp rate 亮点 out
原文地址:http://www.cnblogs.com/grows/p/7301255.html