设计模式系列(四)装饰者模式

来源:互联网 发布:马来西亚域名 编辑:程序博客网 时间:2024/05/22 07:05

继续上一系列的需求:我们需要一个能唱歌、能跳舞、会暖床的女友。现在摆在我们面前的只有一个会唱歌的,我们既不能打,也不能骂,那该怎么办呢?别急,装饰者模式帮你实现这个愿望。

装饰者模式:不修改原来的类来为一个动态的增加一些功能。

public  class Girl1 implements Girl{         public void sing(){System.out.println("我会唱歌");      }}
小伙伴可以看到,上边这个类就是给我们的一个只会唱歌的女孩,让LZ带着大家不打不骂的把她变成一个还能跳舞,还能暖床的全能女友。

首先抽象出来一个女孩的接口,不仅这一个女孩我们可以增加功能,再来几个也可以搞定哦。

public  interface Girl {public void sing();}
然后我们来新建一个装饰类来负责给这个只会唱歌的小姑娘来培训一番

public abstract class GirlDecorator implements Girl  {protected Girl girl;public GirlDecorator(Girl girl){this.girl= girl;}public GirlDecorator() {}}
这个装饰类是一个抽象类,他实现了女孩这个接口,一个有参的构造方法代表着他持有的女孩的引用是根据构造方法来确定的,也就是说,你把谁传给我,我就帮你调教谁O(∩_∩)O

比如会跳舞

public class DanceGirl extends GirlDecorator {public DanceGirl(Girl girl) {super(girl);}public void sing(){girl.sing();dance();}public void dance(){System.out.println("我会跳舞");}}

再比如会暖床
public class WarmBedGirl extends GirlDecorator {public WarmBedGirl(Girl girl) {super(girl);}public void sing(){girl.sing();warmBed();}public void warmBed(){System.out.println("我会暖床");}}
这两个类都是装饰类的子类,他们可以动态的根据我们的需求来为我们构造具有各自功能的女友

public class Main {public static void main(String[] args) {//1.初始的女孩只能唱歌Girl girl =new Girl1();girl.sing();System.out.println("-----------------------------------");//2.能唱歌能跳舞的女孩Girl girl1=new DanceGirl(girl);girl1.sing();System.out.println("-----------------------------------");//3.能唱歌能暖床的女孩Girl girl2=new WarmBedGirl(girl1);girl2.sing();}}
这个就是测试类了,装饰者模式讲到这里。希望大家记住的是他的思想,而不是代码,相信你们理解了以后肯定会写出比我更漂亮的代码。

最后奉上源码一份供大家参考。

原创粉丝点击