• 设计模式之适配器模式


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

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

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

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

  • 相关阅读:
    赋值运算 就是 +*/ 什么的啦
    利用application,cookies,sessino以及文件文件操作制作计数器和投票的综合实例(按学习进程更新)
    实现二级联动菜单 C#,带完整数据库 SQL
    写入、读取 cookie 无聊顺便复习了下前面学的东西!
    两级联动菜单之ListBox.item.add做法
    利用textbox接收两个数,列出一个数组,并做简单的运算
    .net服务器控件列表19个
    循环显示checkboxlist控件项的时候,count到底要不要 1
    validation验证控件案例以及正则表达式中几个特殊符号的说明!
    上传文件 动作详解(最简单的这种)
  • 原文地址:https://www.cnblogs.com/ad-zhou/p/11600000.html
Copyright © 2020-2023  润新知