装饰者模式

来源:互联网 发布:无线网测试软件 编辑:程序博客网 时间:2024/06/07 05:17

装饰者模式

什么是装饰者模式
装饰者模式,就是动态地把职责附加到已有对象上去,实现功能扩展。这种特性,使得装饰者提供了比继承更具有弹性的解决方案

装饰者模式类图

送你一个女朋友怎么样!想她是美国金发大妞?浪漫的法国女郎?国产的萌萌哒妹子?OK,没问题!你想她是哪个国家的就是哪个国家的。她们有不同的爱好或者习惯,每一个这样的女孩,都可以看作是一个 Java 类。我知道此刻你一定在想,这一个、那一个…那岂不是有很多类?这种方式没有扩展性,每当有一个新类型的女孩,就得又新建一个类,这简直就是类爆炸啊!

装饰者模式示例代码

`    //抽象类Girl    public abstract class Girl {        String description = "no particular";        public String getDescription() {            return description;        }    }    //美国女孩    public class AmericanGirl extends Girl {        public AmericanGirl() {            description = "+AmericanGirl";        }    }    //国产妹子    public class ChineseGirl extends Girl {        public ChineseGirl() {            description = "+ChineseGirl";        }    }    //装饰者    public abstract class GirlDecorator extends Girl {        public abstract String getDescription();    }    //下面以美国女孩示例    //给美国女孩加上金发    public class GoldenHair extends GirlDecorator {        private Girl girl;        public GoldenHair(Girl g) {            girl = g;        }        public String getDescription() {            return girl.getDescription() + "with golden hair";        }    }    public class Tall extends GirlDecorator {        private Girl girl;        public Tall(Girl g) {            girl = g;        }        public String getDescription() {            return girl.getDescription() + "is very tall";        }    }    public class Test {        public static void main(String[] args) {            Girl g1 = new AmericanGirl();            System.out.println(g1.getDescription());            GoldenHair g2 = new GoldenHair(g1);            System.out.println(g2.getDescription());            Tall g3 = new Tall(g2);            System.out.println(g3.getDescription());        }    }`

装饰者模式应用
当你需要动态的给一个对象添加功能,实现功能扩展的时候,就可以使用装饰者模式。

Java IO类中有一个经典的装饰者模式应用,BufferedReader装饰了InputStreamReader。

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

装饰者模式,适配器模式区别

关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统来说是不可见或者说不可用的;而装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口);而装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。
原创粉丝点击