设计模式之适配器模式

参考https://www.cnblogs.com/V1haoge/p/6479118.html

定义:
将一个接口转换成用户希望的另一个接口,使两个不相容的接口可以一起工作

包含角色:
1.目标抽象类Target
2.适配器类 Adapter
3.适配者类 Adaptee

分类:
1.类适配器

public class Adapter extends Adaptee implements Target{
    @Override
    public void xxx(){
        dosome();
        super.dosome();
    }
}

2.对象适配器

public class Adapter extends Target{
    
    //Adaptee为final class
    private Adaptee adaptee;
    
    @Override
    public void xxx(){
        dosome();
        adaptee.dosome();
    }
}

共同优点:1.将目标类与适配者类解耦,引入一个适配器类来重用现有的适配者类,而无需修改源代码
    2.增加了类的透明性和复用性,把具体实现封装在适配者类中
    3.灵活性和扩展性都非常好,可以很方便的更换适配器,符合开闭原则
    
类适配器的缺点:一次只能适配一个适配者类(转换头只能把USB转换成固定孔数),不能将多个适配者类适配到一个接口(不能多继承)
对象适配器的优点:可以把多个适配者类适配到目标接口(可以在构造函数中初始化多个类)
对象适配器的缺点: 与类适配器相比,想要换掉适配者类里面的方法不容易,(类适配器是继承,直接重写,对象适配器是引用)

适用环境:1.系统需要使用现有的类,而这些类的接口不符合系统的需要
       2.想要建立一个重复使用的类,把那些没有太多关系的类关联进来一起工作

(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
(2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。

特别注意:需要针对抽象目标类进行编程

扩展:1.默认适配器,即实现接口的抽象类,
    2.双向适配器,把A适配成B,B适配成A

自我猜想:

/** 适配器
 * @author Administrator
 *
 */
public class AdapterModel {
	static interface UserService{
		public City queryCityById();
	}
	static abstract class UserService2{
		public abstract City queryCityById();
	}
	static interface CityService{
		public City selById();
	}
	static class CityServiceImpl implements CityService{
		@Override
		public City selById() {
			return new City();
		}
	}
	static class City{
	}
	//类适配器
	static class UserServiceImpl extends CityServiceImpl implements UserService{
		@Override
		public City queryCityById() {
			return super.selById();
		}
	}
	//对象适配器
	static class UserServiceImpl2 extends UserService2{
		private CityService cityService;
		@Override
		public City queryCityById() {
			return cityService.selById();
		}
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值