zoukankan      html  css  js  c++  java
  • 适配器设计模式

    什么是adpter (wrapper)适配器

    假设我们当前有一个从日本买回的笔记本电脑,但是我国的AC都是220V的电源,如果我们想要使用,还得买一个电源适配器把220V转换为100V的AC ,这个作为转换电源灯的适配器就是现在要说的适配器了.

    适配器的种类

    | 名称 | 具体|
    类适配器 | 使用继承的适配器
    对象适配器 | 使用委托的适配器

    具体什么时候使用适配器 有点

    • 在敏捷开发过程中,我们并非是从零开始编程,如果使用现有已经完善的功能类,开发新的功能类,在使用适配器的情况,如果出现bug我们可以立即在适配器类中寻找bug,不用顾及过去已经完善的类
    • adpter 在不改变现有代码的情况下 使现有代码适配于新的接口,如果可能的话,在不知道现有类的功能,就可以编写新的类.
    • 照顾版本升级与迭代 : 如果新的版本已经开发出来,但是不想丢下老的版本的,那么适配器是新老版本的中间件
    • adpter 在使用的过程中与target 必须是一致的 ,如果不一致,将无法完成我们的功能.
    • 简单的说当成现有程序达不到我们的要求的时候,我们通过wrapper进行包装,产生达到我们的需求的程序.

    类适配器(以适配器显示打印两种字符 #为weak * strong)

    UML图

    • banner 为已经实现的功能类 220V电源
    • print 接口 我们需要的功能类 12v直流电源
    • printbanner 为适配器 转换器

    code

    • banner
    
    public class Banner {
    
        private String str;
    
        public Banner(String str) {
            this.str = str;
        }
        public void printStarWeak(){
            System.out.println("**"+this.str+"** ");
        }
        public void printStarStrong(){
            System.out.println("##"+this.str+"##");
        }
    }
    
    
    • print
    public interface Print {
        public abstract void printWeak();
        public abstract void printStrong();
    }
    
    • printbanner
    public class PrintBanner extends Banner implements Print{
        public PrintBanner(String str) {
            super(str);
        }
    
        @Override
        public void printWeak() {
            super.printStarWeak();
        }
    
        @Override
        public void printStrong() {
            super.printStarStrong();
        }
    }
    
    

    表格加强说明关系

    对象适配器(使用委托

    • 说明: 使用委托:将某个方法中的实际处理交给其他实例的方法(在java中使用委托 可以使用静态委托 动态委托) 这里选择使用静态委托
      依据要求: MainT类 Banner类 与前面的完全相同,改变的是printBanner类 在printbanner类中声明一个字段的,通过字段进行调用.

    UML 使用委托

    • print: 对象适配器替换的为抽象类, 有因为java不能多重继承,所以采用委托的方式.

    • printbanner: 迭代器方式,提供委托的办法调用实际banner的已经实现的方法.

    Code

    • print
    public abstract class Print {
        public abstract void printWeak();
        public abstract void printStrong();
    }
    
    
    • printbanner
    public class printBanner extends Print{
        private Banner banner;
    
        public printBanner(String str) {
            this.banner = new Banner(str);
        }
    
        @Override
        public void printWeak() {
            banner.printStarWeak();
        }
    
        @Override
        public void printStrong() {
            banner.printStarStrong();
        }
    }
    
    

    相关设计模式

    • Bridge: adpter设计模式用于连接接口(api)不同的类, 而Bridge 用于链接类的功能层次结构与实现层次结构.
    • Decorator: 用于填补不同的接口之间的缝隙, 而装饰者设计模式则是在不改变接口的前提下增加功能.

    提高:

    question: 请使用adpter模式编写一个将属性集合保存至文件中的FilePropertion类
    FiloIo(Target) 中声明了将属性集合保存至文件的方法.并且假设FilePropertion类将实现这个FileIo接口 输入文件 file.txt 输出文件newfile.txt.
    编写FilePropertion适配器,在我们只知道的FiloIo的情况下也可以对属性进行处理.

    code

    • FileIO
    
    public interface FileIO {
        public void readFromFile(String filename) throws IOException;
        public void writeToFile(String filename) throws IOException;
        public void setValue(String key, String value);
        public String getValue(String key);
    }
    
    
    • MainT
    public class MainT {
            public static void main(String[] args) {
                FileIO f = new FileProperties();
                try {
                    f.readFromFile("file.txt");
                    f.setValue("year", "2004");
                    f.setValue("month", "4");
                    f.setValue("day", "21");
                    f.writeToFile("newfile.txt");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
    
    
    • 答案
    
     **/
    public class FileProperties extends Properties implements FileIO {
    
        @Override
        public void readFromFile(String filename) throws IOException {
                super.load(new FileInputStream(filename));
        }
    
        @Override
        public void writeToFile(String filename) throws IOException {
            super.store(new FileOutputStream(filename),"写出的配置文件");
        }
    
        @Override
        public void setValue(String key, String value) {
                super.setProperty(key,value);
        }
    
        @Override
        public String getValue(String key) {
            return getProperty(key, "");
        }
    }
    
    
    • UML 图

  • 相关阅读:
    1、1、2、3、5、8、13、21、34...... 求第X位数是多少,2种实现方式
    数据库设计的三大范式
    Parse与TryParse的区别
    常用Lambda范例
    【转载】说说JSON和JSONP,
    Lambda表达式
    Winform部署时强名称签名mshtml.dll无效的解决方案
    .net面试问答(大汇总)
    Asp.net MVC3 一语道破
    在asp.net中使用 log4net
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8781609.html
Copyright © 2011-2022 走看看