zoukankan      html  css  js  c++  java
  • 适配器模式应用——电源适配器

    一模式定义

    存在两种适配器模式

    1 对象适配器模式,在这种适配器模式中,适配器容纳一个它包裹的类对象的物理实体。

    2 类适配器模式,在这种适配器模式中,适配器继承自已实现的类。

    二模式举例

    1模式分析

    我们借用笔计本电源适配器来说明这一模式。

    已经存在的交流电源

    笔记本电脑

    电源适配器


     

    2适配器模式的静态建模



     

    3代码举例

    3.1抽象电源建立

    package com.demo.power;
    
    /**
     * 电源基类
     * 
     * @author
     * 
     */
    public abstract class AbsBasePower
    {
    	// 电压值
    	private float power;
    	// 单位
    	private String unit = "V";
    
    	// 构造方法
    	public AbsBasePower(float power)
    	{
    		this.power = power;
    	}
    
    	public float getPower()
    	{
    		return power;
    	}
    
    	public void setPower(float power)
    	{
    		this.power = power;
    	}
    
    	public String getUnit()
    	{
    		return unit;
    	}
    
    	public void setUnit(String unit)
    	{
    		this.unit = unit;
    	}
    }

     3.2 220v电源接口

    package com.demo.power.v220;
    
    /**
     * 220V 电源接口
     * 
     * @author
     * 
     */
    public interface IPower220 {
    	// 220V交流电源打印
    	public void output220v();
    }

     3.3 220v电源实现类

    package com.demo.power.v220;
    
    import com.demo.power.AbsBasePower;
    
    /**
     * 220V电源
     * 
     * @author
     * 
     */
    public class Power220 extends AbsBasePower implements IPower220
    {
    	// 构造方法
    	public Power220()
    	{
    		super(220);
    	}
    
    	// 220V电源输出
    	public void output220v()
    	{
    		System.out.println("----这是[" + this.getPower() + this.getUnit() + "]电源!...");
    	}
    }

     3.4 12v电源接口

    package com.demo.power.v12;
    
    /**
     * 12V 电源接口
     * 
     * @author
     * 
     */
    public interface IPower12 {
    	// 12V电源打印
    	public void output12v();
    }

     3.5 12v电源实现类

    package com.demo.power.v12;
    
    import com.demo.power.AbsBasePower;
    
    /**
     * 正常的12V电源
     * 
     * @author
     * 
     */
    public class Power12 extends AbsBasePower implements IPower12 {
    
    	// 12V电源构造方法
    	public Power12() {
    		super(12);
    	}
    
    	// 12V电源输出
    	public void output12v() {
    		System.out.println("----这是[" + this.getPower() + this.getUnit()
    				+ "]电源!...");
    
    	}
    
    }

     3.6  12v电源对象适配器

    package com.demo.adapter;
    
    import com.demo.power.AbsBasePower;
    import com.demo.power.v12.IPower12;
    
    /**
     * 电源适配器 (实现目标对象接口 即:12V电源接口)
     * 
     * @author
     * 
     */
    public class AdapterPower12 implements IPower12 {
    	// 待转换的对象
    	private final AbsBasePower absBasePower;
    
    	// 适配器构造方法 将待转换对象传入
    	public AdapterPower12(AbsBasePower absBasePower) {
    		this.absBasePower = absBasePower;
    	}
    
    	// 实现目标对象方法
    	public void output12v() {
    		// 获得外部电源值
    		float powerFloat = this.absBasePower.getPower();
    		// 进行电源转换
    		if (powerFloat == 380) {
    			// 380V电源转换
    			powerFloat = powerFloat / 31.67f;
    		} else if (powerFloat == 220) {
    			// 220V电源转换
    			powerFloat = powerFloat / 18.33f;
    		} else if (powerFloat == 110) {
    			// 110V电源转换
    			powerFloat = powerFloat / 9.17f;
    		} else {
    			System.out.println("----不能适配电源!...");
    			return;
    		}
    
    		// 处理转换结果
    		powerFloat = (int) (powerFloat * 10) / 10.0f;
    		System.out.println("----这是[" + powerFloat + this.absBasePower.getUnit()
    				+ "]电源!...");
    	}
    
    }

    3.7  12v电源类适配器

    package com.demo.adapter;
    
    import com.demo.power.AbsBasePower;
    import com.demo.power.v12.IPower12;
    
    /**
     * 电源适配器 (实现目标对象接口 即:12V电源接口) 类适配器 模式
     * 
     * @author
     * 
     */
    public class AdapterPower12Ext extends AbsBasePower implements IPower12 {
    
    	// 适配器构造方法 将待转换对象传入
    	public AdapterPower12Ext(AbsBasePower absBasePower) {
    		super(absBasePower.getPower());
    	}
    
    	// 实现目标对象方法
    	@Override
    	public void output12v() {
    		// 获得外部电源值
    		float powerFloat = this.getPower();
    		// 进行电源转换
    		if (powerFloat == 380) {
    			// 380V电源转换
    			powerFloat = powerFloat / 31.67f;
    		} else if (powerFloat == 220) {
    			// 220V电源转换
    			powerFloat = powerFloat / 18.33f;
    		} else if (powerFloat == 110) {
    			// 110V电源转换
    			powerFloat = powerFloat / 9.17f;
    		} else {
    			System.out.println("----不能适配电源!...");
    			return;
    		}
    
    		// 处理转换结果
    		powerFloat = (int) (powerFloat * 10) / 10.0f;
    		System.out.println("----这是[" + powerFloat + this.getUnit() + "]电源!...");
    	}
    
    }

     3.8  测试适配器

    package com.demo;
    
    import com.demo.adapter.AdapterPower12;
    import com.demo.adapter.AdapterPower12Ext;
    import com.demo.power.v12.IPower12;
    import com.demo.power.v12.Power12;
    import com.demo.power.v220.Power220;
    
    /**
     * 客户端程序调用
     * 
     * @author
     * 
     */
    public class Client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// 我们首先 生成一个220V电源对象!
    		Power220 power220 = new Power220();
    		power220.output220v();
    
    		// 接下来,我们在生成一个12V电源对象!
    		IPower12 power12 = new Power12();
    		power12.output12v();
    
    		// 最后,我们使用电源适配器 将220V电源转换为12V电源!
    		System.out.println("
    ----电源适配器转换中...");
    		IPower12 adapterPower12 = new AdapterPower12(power220);
    		adapterPower12.output12v();
    		System.out.println("----电源适配器转换结束!");
    
    		// 类适配器实现
    		System.out.println("
    ----类适配器 电源适配器转换中...");
    		IPower12 adapterPower12Ext = new AdapterPower12Ext(power220);
    		adapterPower12Ext.output12v();
    		System.out.println("----类适配器 电源适配器转换结束!");
    	}
    }

     3.9 运行结果

    ----这是[220.0V]电源!...

    ----这是[12.0V]电源!...

    ----电源适配器转换中...

    ----这是[12.0V]电源!...

    ----电源适配器转换结束!

    ----类适配器 电源适配器转换中...

    ----这是[12.0V]电源!...

    ----类适配器 电源适配器转换结束!

    三 设计原则

    1使用对象组合,面向接口和抽象编程

    2“开一闭”原则

    四 使用场合

    1软件系统结构需要升级或扩展,又不想影响原有系统稳定运行的时候

    2转换类之间的差別不是很大的时候

    3想创建一个可以复用的类,该类可以与其他不相关类或不可预见类协同工作的时候

    五 类适配器模式和对象适配器模式的静态类图



     

  • 相关阅读:
    epoll讲解
    Majority Element
    Excel Sheet Column Title
    Git链接到自己的Github(2)进阶使用
    Git链接到自己的Github(1)简单的开始
    直接管理内存
    Oracle 11g 编译使用BBED
    Oracle数据库该如何着手优化一个SQL
    Oracle配置数据库诊断
    Oracle 数据库重放(Database Replay)功能演示
  • 原文地址:https://www.cnblogs.com/ainima/p/6331649.html
Copyright © 2011-2022 走看看