13、大话设计模式之适配器模式

作用:一个类的接口转换成客户希望的另外一个接口,使得原本由接口不兼容而不能一起工作的那些类可以一起工作,代码中核心的类就是适配器类

白话:

1、想象USB接口,充电不同的手机。在想使用一个已经存在的类,但是他的接口方法和你要求不相同,就需要考虑适配器模式。

2、两个类所做的事情相同或者类似,但是具有不同的接口时需要使用适配器模式、

3、客户代码可以统一调用同一个接口,就好像USB接口都不太容易修改的时候,而需要使用的设计模式。

重点:功能要类似才能使用该设计模式

1、适配器模式

1、需要适配的类

这个类是需要适应客户希望的类

class Adaptee {
    public void specificRequest(){
        System.out.println("特殊请求!");
    }
}

2、客户期待的接口

下面的是客户期待的类,也就是想让上面的Adaptee类功能,能在Target类中使用

class Target {
    public void request(){
        System.out.println("普通请求!");
    }
}

 3、适配器类(重点)

适配器类:编写一个类继承客户接口,内部创建一个私有被适配的类,间接调用被适配类的方法

class Adapter extends Target {

    private Adaptee adaptee = new Adaptee(); //建立一个私有的Adaptee对象

    public void request(){          //这样就可以把表面上调用request()方法
        adaptee.specificRequest();  //变成实际调用specificRequest()
    }
}

4、测试和结果

public class Test {
	
	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

        Target target = new Adapter();

        target.request();

        

		System.out.println();
		System.out.println("**********************************************");

	}
}

结果

 2、适配器模式使用

都是中国球员沟通进攻防守,要适配一个外国人和中国沟通进行进攻和防守实现适配

1、需要适配的类

class ForeignCenter {
    private String name;
    public String getName(){
        return this.name;
    }
    public void setName(String value){
        this.name = value;
    }

    public void 进攻(){
        System.out.println("外籍中锋 "+this.name+" 进攻");
    }    

    public void 防守(){
        System.out.println("外籍中锋 "+this.name+" 防守");
    }
}

2、客户期待的接口

abstract class Player {
    protected String name;
    public Player(String name){
        this.name = name;
    }

    public abstract void attack();  //进攻
    public abstract void defense(); //防守
}

3、适配器类(重点)

class Translator extends Player {

    private ForeignCenter foreignCenter = new ForeignCenter();

    public Translator(String name){
        super(name);
        foreignCenter.setName(name);
    }

    public void attack(){
        foreignCenter.进攻();
    }

    public void defense(){
        foreignCenter.防守();
    }
}

4、客户期待类的实现

不是重点,可以不用看

class Forwards extends Player {
    public Forwards(String name){
        super(name);
    }

    public void attack(){
        System.out.println("前锋 "+this.name+" 进攻");
    }

    public void defense(){
        System.out.println("前锋 "+this.name+" 防守");
    }
}

//中锋
class Center extends Player {
    public Center(String name){
        super(name);
    }

    public void attack(){
        System.out.println("中锋 "+this.name+" 进攻");
    }

    public void defense(){
        System.out.println("中锋 "+this.name+" 防守");
    }
}

//后卫
class Guards extends Player {
    public Guards(String name){
        super(name);
    }

    public void attack(){
        System.out.println("后卫 "+this.name+" 进攻");
    }

    public void defense(){
        System.out.println("后卫 "+this.name+" 防守");
    }
}

5、测试和结果

public class Test {
	
	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

        Player forwards = new Forwards("巴蒂尔");
        forwards.attack();
        
        Player guards = new Guards("麦克格雷迪");
        guards.attack();
        
        Player center = new Translator("姚明");
        
        center.attack();
        center.defense();

		System.out.println();
		System.out.println("**********************************************");

	}
}

结果

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越没意思

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值