zoukankan      html  css  js  c++  java
  • 装饰器模式

    转自:http://blog.csdn.net/cnweike/article/details/6779441

    很多东西在装饰 着你:比如你的衣服...

    所谓装饰吗,仅仅是装饰而已。假如你有一只狗,给它系了跟红领巾,变漂亮了,这就是装饰了。可是狗该跑还是跑,该叫还是叫,总之你装饰不能(至少大多数情况下不能)把原来的东西给装饰没了吧。还有,你小时候看过那些小人在机器人里的动画片吧,看看,人家叫来了机器人,钻到里面,手上就能开火了,两只脚也变成了火箭推进器,功能是大大地增加了呀 !看到了吧,装饰不仅仅是花架子。

    在设计模式的世界里,也有装饰,这个装饰也不是花架子,它对于扩展现有系统的功能而尽量少改变原来的系统是很有帮助的。看看一个小例子:
    (由于Java概念上的规范性,Java是很适合来做设计模式的例子的)

    继续我们鸭子的故事:

    鸭子一般都是会叫的东西,前提是它是活的,如果是一只木头鸭子,那它就不会叫了。。。

    package dec;

    public interface Quackable {
    //会叫的东西都要实现这个接口
        public void quack();
    }

    下面是我们搞来的一只鸭子,它是红头鸭,是一种会呱呱叫的鸭子:

    package dec;

    public class RedheadDuck implements Quackable {

        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("我在呱呱叫!!");
        }

    }

    毕竟不仅仅红头鸭会呱呱叫 ,我们又逮了一只绿头鸭:

    package dec;

    public class MallardDuck implements Quackable {

        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("我在呱呱叫!!");
        }

    }

    技术太发达了,居然可以模拟呱呱叫的机器都出来了:

    package dec;

    public class DuckCall implements Quackable {

        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("我在模拟呱呱叫!!");
        }

    }

    玩具厂商生产了一种橡皮鸭子(捏一捏可会吱吱叫的哦):
    package dec;

    public class RubberDuck implements Quackable {

        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("吱吱叫!!");
        }

    }

    我们把这些真真假假的鸭子弄到一起,听听它们的叫声:

    package dec;

    public class DuckSimulator {

        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            DuckSimulator simulator = new DuckSimulator();
            simulator.simulate();
        }

        void simulate(){
            Quackable mduck = new MallardDuck();
            Quackable rduck = new RedheadDuck();
            Quackable duckCall = new DuckCall();
            Quackable rubberDuck = new RubberDuck();
            
            System.out.println("鸭子模拟器:/n");
            simulate(mduck);
            simulate(rduck);
            simulate(duckCall);
            simulate(rubberDuck);
        }
        
        void simulate(Quackable duck){
            duck.quack();
        }
    }

    输出:

    鸭子模拟器:

    呱呱叫!!!
    我在呱呱叫!!
    我在模拟呱呱叫!!
    吱吱叫!!

    哈哈,他们都在叫!!他们叫了多少声啊,我数了数叫了4下 !,可能不能让程序自己给我统计出来。。增加功能,那就装饰器呗:

    package dec;

    public class QuackCounter implements Quackable {
        
        Quackable duck;
        static int numberOfQuacks;
        
        public QuackCounter(Quackable duck){
            this.duck = duck;
        }
        
        @Override
        public void quack() {
            // TODO Auto-generated method stub
            duck.quack();
            numberOfQuacks ++;
        }

        public static int getQuacks(){
            return numberOfQuacks;
        }
    }

    正如你所见的,装饰器也是一个会叫的东西,毕竟,我们需要的还是鸭子。。。至于要装饰哪只鸭子,你当然得告诉装饰器了,正如构造函数里所做的那样!

    我们看看装饰后的效果:
    package dec;

    public class DuckSimulator {

        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            DuckSimulator simulator = new DuckSimulator();
            simulator.simulate();
        }

        void simulate(){
            Quackable mduck = new QuackCounter(new MallardDuck());
            Quackable rduck = new QuackCounter(new RedheadDuck());
            Quackable duckCall = new QuackCounter(new DuckCall());
            Quackable rubberDuck = new QuackCounter(new RubberDuck());
            
            System.out.println("鸭子模拟器:/n");
            simulate(mduck);
            simulate(rduck);
            simulate(duckCall);
            simulate(rubberDuck);
            System.out.println("我们一共叫了 " + QuackCounter.getQuacks() + "少声!");
        }
        
        void simulate(Quackable duck){
            duck.quack();
        }
    }

    输出:

    鸭子模拟器:

    呱呱叫!!!
    我在呱呱叫!!
    我在模拟呱呱叫!!
    吱吱叫!!
    我们一共叫了 4少声!

    从此,我不用再去费劲自己去数它们叫了多少声了!而此时此刻,你依然可以使用没有被装饰过的鸭子(如果你不需要知道它们叫了多少声的话)。其实我们做的就是为每只鸭子装了个跟踪器,呵呵。

  • 相关阅读:
    SQL server 数据库的版本为661,无法打开,此服务器只支持655版及更低版本。不支持降级路径
    SQL Server 2005 企业版没有 Microsoft SQL Server Management
    Tomcat 中 jsp 中文乱码显示处理解决方案
    ASP.NET后台输出js
    未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配
    socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
    C# Socket连接 无法访问已释放的对象
    未找到导入的项目,请确认 <Import> 声明中的路径正确
    轻量级容器Docker+微服务+RESTful API
    Foundation和UIKit框架组织图
  • 原文地址:https://www.cnblogs.com/nishilunhui/p/2859831.html
Copyright © 2011-2022 走看看