zoukankan      html  css  js  c++  java
  • AdapterPattern(23种设计模式之一)


    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则(6):开闭原则

    AdapterPattern,UML抽象图百度找,代码实现如下

    现需要设计一个可以模拟各种动物行为的机器人Robot,在机器人中定义一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人既能够像鸟Bird一样的叫和飞,又能像狗Dog一样的叫和跑,使用适配器模式进行系统设计并编程实现

    首先,先来先讲讲适配器。适配就是由“源”到“目标”的适配,而当中链接两者的关系就是适配器。它负责把“源”过度到“目标”。在这个例子中,有一个“源”是一机器人对象,他拥有2种技能分别是叫喊和移动,而现在需要机器人变成鸟和狗,好了,现在我们的任务就是要将机器人这个“源”适配到这个岗位中,如何适配呢?显而易见地我们需要为机器人添加一个飞或者跑的方法,这样才能满足不同目标的需要

    适配器模式有2种,第一种是“面向类的适配器模式”,第二种是“面向对象的适配器模式”

    面向类的适配器模式代码实现

    源类

    package AdapterPattern;
    public class RobotSource {
    	public void cry(){
    		System.out.println("cry");
    	}
    	public void move(){
    		System.out.println("move!");
    	}
    }
    

    目标接口

    package AdapterPattern;
    public interface Bird {
    	public void cry();
    	public void fly();
    }
    
    package AdapterPattern;
    public interface Dog {
    	public void cry();
    	public void run();
    }
    

    适配器类

    package AdapterPattern;
    public class BirdRobotAdapter extends RobotSource implements Bird{
    	@Override
    	public void fly() {
    		System.out.println("bird fly");
    	}
    }
    
    package AdapterPattern;
    public class DogRobotAdapter extends RobotSource implements Dog{
    	@Override
    	public void run() {
    		System.out.println("dog run");
    	}
    	
    }
    

    面向对象的适配器模式

    适配器类

    只有适配器的差别,其他同上
    package AdapterPattern;
    public class BirdRobotAdapter implements Bird{
    	RobotSource robot;
    	public BirdRobotAdapter(RobotSource robot){
    		this.robot = robot;
    	}
    	@Override
    	public void cry() {
    		robot.cry();
    	}
    
    	@Override
    	public void fly() {
    		System.out.println("bird fly");
    	}
    }
    
    package AdapterPattern;
    public class DogRobotAdapter implements Dog{
    	RobotSource robot;
    
    	public DogRobotAdapter(RobotSource robot){
    		this.robot = robot;
    	}
    	@Override
    	public void cry() {
    		robot.cry();
    	}
    
    	@Override
    	public void run() {
    		System.out.println("dog run");
    	}
    	
    }
    

    分析

    1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。
    2.适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

    最后,再来顺带谈谈默认适配器模式:这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用中默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。例如一个人的技能与工作岗位的适配过程,代码如下:

    接口类

    public interface Job {  
        public abstract void speakJapanese();  
        public abstract void speakEnglish();  
        public abstract void speakFrench();  
        public abstract void speakChinese();     
    }  
    

    抽象类

    public abstract class JobDefault implements Job{  
        public void speakChinese() {  
              
        }  
        public void speakEnglish() {  
              
        }  
        public void speakFrench() {  
              
        }  
        public void speakJapanese() {  
              
        }   
    }
    

    实现类

    public class JobImpl extends JobDefault{  
        public void speakChinese(){  
            System.out.println("I can speak Chinese!");  
        }    
    }  
    

    别嫌弃我没写注释,这个代码很简单,注释省略,嘿嘿。
  • 相关阅读:
    ActiveReports 报表应用教程 (9)---交互式报表之动态排序
    struts2-结果处理方式
    struts2-action的创建方式
    struts2-动态方调用
    struts2-常量配置
    struts2架构图
    maven依赖范围-Scope
    Maven在eclipse的使用入门
    Maven简介
    数组的学习与使用
  • 原文地址:https://www.cnblogs.com/1996jiwei/p/6609478.html
Copyright © 2011-2022 走看看