zoukankan      html  css  js  c++  java
  • Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系。可是我们如今既想用当中一个类的方法。同一时候也想用另外一个类的方法。有一个解决方法是。改动它们各自的接口。可是这是我们最不愿意看到的。这个时候Adapter模式就会派上用场了

    适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器

    下面举例说明:

    类适配器 类图


    public class DrawRectangle {//画方
    	public void drawRectangle(String msg) {
    		System.out.println("draw Rectangle: " + msg);
    	}
    }

    public interface IDrawCircle {//画圆的接口
    	void drawCircle();
    }

    /**
     * 类适配器 使用对象继承的方式,是静态的定义方式
     * @author stone
     *
     */
    public class DrawAdapter4Class extends DrawRectangle implements IDrawCircle {//既能画方又能画圆
    
    	@Override
    	public void drawCircle() {
    		System.out.println("DrawAdapter4Class: drawCircle");
    	}
    	
    }

    对象适配器类图:


    /**
     * 对象适配器: 使用对象组合的方式,是动态组合的方式。
     * 既能画方又能画圆
     * @author stone
     * DrawAdapter是适配器,DrawRectangle属于adapter,是被适配者,适配器将被适配者和适配目标(DrawCircle)进行适配
     *
     */
    public class DrawAdapter4Object implements IDrawCircle {//既能画方又能画圆
    	
    	private DrawRectangle drawRectangle;
    	public DrawAdapter4Object(DrawRectangle drawRectangle) {
    		this.drawRectangle = drawRectangle;
    	}
    	
    	@Override
    	public void drawCircle() {
    		System.out.println("DrawAdapter4Object: drawcircle");
    	}
    	
    	public void drawRectangle(String msg) {
    		drawRectangle.drawRectangle(msg);
    	} 
    	
    }

    接口适配器

    类图


    /*
     * 接口适配器:接口中有抽象方法,我们仅仅想实现当中的几个。不想所有实现,
     * 所以提供一个默认空实现,然后继承自它,重写实现我们想实现的方法
     */
    public interface IDraw {
    	void drawCircle();
    	void drawRectangle();
    }

    /*
     * 接口适配器 的默认实现
     */
    public class DefaultDrawAdapter implements IDraw {//画方 画圆 皆为空实现
    
    	@Override
    	public void drawCircle() {
    		
    	}
    
    	@Override
    	public void drawRectangle() {
    		
    	}
    }
    

    public class Test {
    	public static void main(String[] args) {
    		//对象适配器
    		DrawAdapter4Object objAdapter = new DrawAdapter4Object(new DrawRectangle());
    		objAdapter.drawCircle();
    		objAdapter.drawRectangle(" in DrawAdapter4Object");
    		
    		System.out.println("--------------");
    		
    		//类适配器
    		DrawAdapter4Class clzAdapter = new DrawAdapter4Class();
    		clzAdapter.drawCircle();
    		clzAdapter.drawRectangle("in DrawAdapter4Class");
    		
    		System.out.println("--------------");
    		
    		//接口适配器
    		MyDrawAdapter myDrawAdapter = new MyDrawAdapter();
    		myDrawAdapter.drawCircle();
    		myDrawAdapter.drawRectangle();
    	}
    	
    	static class MyDrawAdapter extends DefaultDrawAdapter {
    
    		@Override
    		public void drawCircle() {
    			System.out.println("drawCircle in MyDrawAdapter");
    		}
    		
    	}
    }

    打印

    DrawAdapter4Object: drawcircle
    draw Rectangle:  in DrawAdapter4Object
    --------------
    DrawAdapter4Class: drawCircle
    draw Rectangle: in DrawAdapter4Class
    --------------
    drawCircle in MyDrawAdapter


  • 相关阅读:
    JAVA BigDecimal 小数点处理
    对 Element UI table中数据进行二次处理
    Kettle-User Defined Java Class使用-大写转换
    多线程-同步函数
    多线程-银行分批存款
    多线程-并发卖票
    多线程-控制两个线程交替打印
    ztree-可拖拽可编辑的树
    ztree-编辑节点(树节点添加,删除,修改)
    ztree-拖拽(排序树)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7071461.html
Copyright © 2011-2022 走看看