• 装饰者模式


    装饰者模式

    个人感觉装饰者模式很像我们小的时候玩的变形金刚,最初变形金刚没有任何功能,就是纯粹的一个机器人(被装饰的对象),然后我们给变形金刚装上翅膀,它就会飞了,给它装上防水装甲,它就可以在水里游了。而这些所谓的翅膀、防水装甲就是我们今天要讲的装饰者。OK,下面我们以汽车的例子给大家介绍。

    首先我们定义一辆汽车Car.java,这辆车既可以飞,又可以游,当然也可以跑~

    package decorator01;

     

    public class Car {

        //跑

        public void run(){

           System.out.println("可以跑");

        }

        //飞

        public void fly(){

           System.out.println("可以飞");

        }

        //游

        public void swim(){

           System.out.println("可以游");

        }

    }

    然后我们调用一下

    package decorator01;

     

    public class MainClass {

        public static void main(String[] args) {

           Car bus = new Car();

           bus.run();

           bus.fly();

           bus.swim();

        }

    }

    但是我们貌似发现了一个问题,我们在main函数里面只是想造一辆bus而已,bus需要会飞,需要会游吗?好吧,我们来改一改~我们把Car变成一个接口

    package decorator03;

     

    public interface Car {

        public void show();

        public void run();

    }

    然后我们根据具体的需求分别造出普通的车(RunCar.java),会飞的车(FlyCar.java),会游的车(SwimCar.java)

    RunCar.java:

    package decorator03;

     

    public class RunCar implements Car {

     

        @Override

        public void show() {

           this.run();

        }

       

        public void run(){

           System.out.println("可以跑");

        }

    }

    FlyCar.java:

    package decorator03;

     

    public class FlyCar implements Car {

     

        @Override

        public void show() {

           this.run();

           this.fly();

        }

       

        public void run(){

           System.out.println("可以跑");

        }

       

        public void fly(){

           System.out.println("可以飞");

        }

    }

    SwimCar.java:

    package decorator03;

     

    public class SwimCar implements Car{

     

        @Override

        public void show() {

           this.run();

           this.swim();

        }

     

        @Override

        public void run() {

           System.out.println("可以跑");

        }

     

        public void swim(){

           System.out.println("可以游");

        }

    }

    这样的话我们就可以根据需求来调用了,例如我们需要一辆会飞的车:

    package decorator03;

     

    public class MainClass {

        public static void main(String[] args) {

           Car flycar = new FlyCar();

           flycar.show();

        }

    }

    好了,问题感觉应该完美的解决了,但是这个时候我们希望造一辆会钻地的 车,该怎么办呢?同学会说,简单啊,再创建一个会钻地的Car呀。可我们换一个角度来考虑一下,每当我们要更换一辆车的功能的时候,我们都得重新的创造一辆车,成本不是很大吗?如果此时我们能够纯粹的只造一个翅膀,只造一个潜水装置,只造一个轮子,而不是重新造一辆车,这样的话我们只需要把我们之前造的具体部件安装到最原始的车上,岂不是要方便很多呢?就好像我们最初所举的变形金刚的例子。

    好了,有了这种思想,我们就进入到我们的装饰者模式。

    我们先创建一个装饰者的父类:

    package decorator06;

     

    public abstract class CarDecorator implements Car{

        private Car car;

       

        public Car getCar() {

           return car;

        }

     

        public void setCar(Car car) {

           this.car = car;

        }

     

        public CarDecorator(Car car){

           this.car = car;

        }

       

        public abstract void show();

    }

    注意,这里CarDecorator.java实现了Car接口,至于为什么,请留着这个疑问看到最后。

    然后我们造一个翅膀吧

    package decorator06;

     

    public class FlyCarDecorator extends CarDecorator {

     

        public FlyCarDecorator(Car car) {

           super(car);

        }

     

        @Override

        public void show() {

           this.getCar().show();

           this.fly();

        }

       

        public void fly(){

           System.out.println("可以飞");

        }

     

        @Override

        public void run() {

           // TODO Auto-generated method stub

          

        }

    }

    接着造潜水装置吧

    package decorator06;

     

    public class SwimCarDecorator extends CarDecorator {

     

        public SwimCarDecorator(Car car) {

           super(car);

        }

     

        @Override

        public void show() {

           this.getCar().show();

           this.swim();

        }

     

        public void swim(){

           System.out.println("可以游");

        }

     

        @Override

        public void run() {

          

        }

    }

    那啥,貌似车本来就会跑,所以轮子我们就不造了,直接给个轮子吧

    package decorator06;

     

    public class RunCar implements Car {

     

        @Override

        public void show() {

           this.run();

        }

       

        public void run(){

           System.out.println("可以跑");

        }

    }

    好了,我们先捋一捋关系,RunCar.java跟SwimCarDecorator.java和FlyCarDecorator.java有着共同的父类Car.java因为SwimCarDecorator.java和FlyCarDecorator.java继承了CarDecorator.java,而CarDecorator.java实现了Car.java接口。

    好了,下面我们可以随意的改装车了

    package decorator06;

     

    public class MainClass {

        public static void main(String[] args) {

           Car runCar = new RunCar();

           CarDecorator swimCarDecorator = new SwimCarDecorator(runCar);

        CarDecorator flyCarDecorator = new FlyCarDecorator(swimCarDecorator);

           flyCarDecorator.show();

        }

    }

    你看,一辆又会飞,又会游,又会跑的车就这么华丽丽的造出来了,很激动有木有~

  • 相关阅读:
    好用的javascript eclipse插件Aptana
    汉字字符串转换成十六进制byte数组,一个汉字存到两个byte里面,大整数存到两个byte里面
    三星 平板手机电脑 Galaxytab2忘记开机密码解决方法
    java float 加减精度问题
    android 增加Addon属性支持的方法
    基于jquery的kendoUI 可以实现快速开发,节省大量web UI开发工作量
    zdz工具箱v1.5 android版本发布了,集成各种个人生活中常用的工具,方便日常使用管理
    存储联系人信息(进程com.motorola.contacts)意外停止 事件提醒eventreminder异常 处理方法
    playframework 同时运行多个项目的方法修改默认端口号
    免费的Git私有代码托管服务
  • 原文地址:https://www.cnblogs.com/magicy/p/4634624.html
Copyright © 2020-2023  润新知