• Adapter适配器模式--图解设计模式


    第二章: Adapter 模式

      Adapter模式分为两种:

        1.类适配器模式

        2.委托适配器

        我看的是《图解设计模式》这本书,这小鬼子说的话真难懂,只能好好看代码理解。

     先说适配器模式要表达的什么意思,首先这个名字就很容易联想到电源适配器,一个道理,我要充电,但你不能让我直接把电线插进插座,这样肯定会冲爆,我用不了这么多电啊! 这时候就需要一个适配器,给电压转换一下充的舒舒服服的,就这意思。

        实际发开中,有一个类库写了很多方法,但我只需要其中一两个,那么就写一个适配器,把这两个方法拿出来用,要是出了Bug,就直接去Adapter里面找,而不是去翻那个类库。

        

      实际编码实现(类适配):

      Banner类所扮演的角色是(Adaptee(被适配)),它内部拥有两个方法,很简单的打印语句:

        

    package example.adapter;
    
    public class Banner {
        private String string;
    
        public Banner(String string) {
            super();
            this.string = string;
        }
    
        public void showWithPeren() {
            System.out.println("(" + string + ")");
        }
    
        public void showWithAster() {
            System.out.println("*" + string + "*");
        }
    }

        

       Print是需求,你需要什么?

     

    package example.adapter;
    
    public interface Print {
        
        public abstract void printWeak();
    
        public abstract void printStrong();
    }

      

      PrintBanner是适配器,实现需求,继承Banner,对外提供Banner的构造和需要的方法:

      

    package example.adapter;
    
    public class PrintBanner extends Banner implements Print{
    
    
    
        public PrintBanner(String string) {
            super(string);
        }
    
        @Override
        public void printWeak() {
            showWithPeren();
        }
    
        @Override
        public void printStrong() {
            showWithAster();
        }
    
    }

     

      Main测试:

    package example.adapter;
    
    public class Main {
        public static void main(String[] args) {
            Print p = new PrintBanner("HelloWorld");
            p.printWeak();
            p.printStrong();
        }
    }    

     

        实际编码实现(委托):

        将Print和PrintBanner稍作改动:

        现在,PrintBanner里面拥有了Banner的成员并在构造方法里面实例化进行调用。

    package example.adapter.two;
    
    public class PrintBanner extends Print{
        
        private Banner banner;
        
        public PrintBanner(String string) {
            super();
            this.banner = new Banner(string);
        }
    
        @Override
        public void printWeak() {
                banner.showWithPeren();
        }
    
        @Override
        public void printStrong() {
                banner.showWithAster();
        }
    
    
    
    }

     

     

      

    package example.adapter.two;
    
    public abstract class Print {
        
        public abstract void printWeak();
    
        public abstract void printStrong();
    }

     

     

      

     

     

      

      

  • 相关阅读:
    [转载]C#流,字节数组,字符串
    [C#错误]未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)
    批处理删除带空格的长目录或文件夹
    注释换行 引号内的字符串没有正确结束
    oracle sqlplus运行sql文件
    Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
    Tomcat:Caused by: java.lang.OutOfMemoryError: PermGen space
    虚拟机vmware启动太快无法进入bios的解决方法
    MySQL Error 1130 Host 'localhost' is not allowed to connect to this MySQL server
    如何远程判断服务器的操作系统?
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/9738154.html
Copyright © 2020-2023  润新知