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

    适配器模式:用于解决两个系统之间的不兼容问题,解决两个接口之间的连接问题;

    目标:将一个类的接口更改为适配另一个类的接口,并且使这些不兼容的类一起工作。

    最佳解决方案:两者实现同一个接口或者继承自同一个抽象类

    类图UML

     实例:

    例如有一个抽象类Player是篮球运动员,该类姓名属性,具有两个方法Attack(),Dfend(),现在中国篮球运动员姚明,调到美国NBA,但是他听不懂教练的语言,只能配翻译,

    翻译在这个地方就是适配器

     Player抽象类

    public abstract class Player {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public abstract void Attack();
    
        public abstract void Dfend();
    }

    继承自Player的USAPlayer

    public class USAPlayer extends Player {
    
        public USAPlayer(String name){
            super.setName(name);
        }
    
        @Override
        public String getName() {
            return super.getName();
        }
    
        @Override
        public void setName(String name) {
            super.setName(name);
        }
    
        @Override
        public void Attack() {
            System.out.println(super.getName()+"正在Attack....");
        }
    
        @Override
        public void Dfend() {
            System.out.println(super.getName()+"正在Dfend....");
        }
    }

    现在中国运动员的类

    public class ChinaPlayer {

    private String name;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public void ChinaAttack(){
    System.out.println(this.getName()+"进攻....");
    }

    public void ChinaDfend(){
    System.out.println(this.getName()+"防守....");
    }
    }

    为了使教练组能够像调用Player一样ChinaPlayer类

    使用翻译类

    public class Translater extends Player {
    
        private ChinaPlayer chinaPlayer =new ChinaPlayer();
    
        public Translater(String name){
            chinaPlayer.setName(name);
        }
    
        @Override
        public String getName() {
            return chinaPlayer.getName();
        }
    
        @Override
        public void setName(String name) {
            chinaPlayer.setName(name);
        }
    
        @Override
        public void Attack() {
            chinaPlayer.ChinaAttack();
        }
    
        @Override
        public void Dfend() {
            chinaPlayer.ChinaDfend();
        }
    }

    主程序代码

    public class Main {
    
        public static void main(String[] args) {
    
            Player p1=new USAPlayer("Jordan");
    
            Player p2=new USAPlayer("James");
    
            Player p3=new Translater("姚明");
    
            p1.Attack();
            p1.Dfend();
            p2.Attack();
            p2.Dfend();
            p3.Attack();
            p3.Dfend();
        }
    }

    运行效果

     核心目的,解决两个不兼容的类直接兼容的问题。

    类似的还有比如用播放器播放MP3,MP4,AVI等格式的媒体文件,由于这些格式的文件,遵循不同的格式,所以必须有一个适配器,使其适应于不同格式文件的读取与播放

  • 相关阅读:
    问题.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合
    java传统web项目添加maven管理jar包,log4j无法正常输出日志
    TortoiseSVN设置Beyond Compare为版本比较、差异合并工具
    Win10以管理员身份启动cmd.exe
    SprinMVC中文件上传只在内存保留一份拷贝
    maven项目运行报错invalid LOC header (bad signature)
    c#编写windows服务在开机是OnStart启动超时
    centos安装mysql
    CENTOS7配置静态IP
    @__CheckForDebuggerJustMyCode@4
  • 原文地址:https://www.cnblogs.com/ad-zhou/p/11600000.html
Copyright © 2011-2022 走看看