• 设计模式之适配器模式


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

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

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

    类图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等格式的媒体文件,由于这些格式的文件,遵循不同的格式,所以必须有一个适配器,使其适应于不同格式文件的读取与播放

  • 相关阅读:
    jquery.tmpl.js 模板引擎用法
    var 的使用
    BUG集锦
    jquery Ajax异步请求之session
    找到多个与名为“Login”的控制器匹配的类型
    蒙板 模态对话框
    mvc通过ActionFilterAttribute做登录检查
    MVC 分页
    MVC 创建线程内的db单例
    Servlet生命周期中的service方法分析
  • 原文地址:https://www.cnblogs.com/ad-zhou/p/11600000.html
Copyright © 2020-2023  润新知