Syong : 适配器模式

适配器模式

What
首先了解一下设计模式的开闭原则(Open/Closed Principle)

In object-oriented programming, the open/closed principle states “software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification”; that is, such an entity can allow its behaviour to be extended without modifying its source code.

也就是说,一个实体在不用更改它的源代码情况下,允许拓展它的行为

适配器模式(Apapter Pattern):在不用更改适配者类代码前提下,通过适配器类拓展其功能。

  1. 目标(Target):目标可以是抽象类或具体类或接口,客户期待接口的样子;
  2. 适配者(Adaptee):适配者类一般是一个已有具体类或接口,但与目标接口不匹配兼容;
  3. 适配器(Adapter):将已有接口转换成目标接口;

适配器模式分三类:

  1. 类适配器模式(class adapter pattern):适配者与适配器是继承关系;
  2. 对象适配器模式(object adapter pattern):适配者与适配器是关联关系;
  3. 缺省适配器模式(default adapter pattern):

当不需要全部实现接口提供的方法时,可以设计一个适配器抽象类实现接口,并为接口中的每个方法提供默认方法,抽象类的子类就可以有选择的覆盖父类的某些方法实现需求,它适用于一个接口不想使用所有的方法的情况。在java8后,接口中可以有default方法,就不需要这种缺省适配器模式了。接口中方法都设置为default,实现为空,这样同样同样可以达到缺省适配器模式同样的效果。

How
示例:类适配器模式(class adapter pattern)

//测试类
public class Test {
    public static void main(String []args) {
		Target adapter = new Adapter();
		adapter.sayHello("song");
    }
}
//适配者
class Adaptee{
	public void method(){
		System.out.println("hello world");
	}
}
//目标
interface Target{
	void sayHello(String name);
}
//适配器类
class Adapter extends Adaptee implements Target{
	@Override
	public void sayHello(String name) {
		System.out.print("Hello " + name + ",");
		super.method();
	}
}

示例:对象适配器模式(object adapter pattern)

//测试类
public class Test {
    public static void main(String []args) {
		Target adapter = new Adapter();
		adapter.sayHello("song");
    }
}
//适配者
class Adaptee{
	public void method(){
		System.out.println("hello world");
	}
}
//目标
interface Target{
	void sayHello(String name);
}
//适配器类
class Adapter implements Target{
	Adaptee adaptee = new Adaptee();
	
	@Override
	public void sayHello(String name) {
		System.out.print("Hello " + name + ",");
		adaptee.method();
	}
}

示例:缺省适配器模式(default adapter pattern)


//测试类
public class Test {
    public static void main(String []args) {
		//不用缺省适配器类
		Target operator1 = new Operator(new Target(){
			@Override
			public void method1(){}
			@Override
			public void method2(){
				System.out.println("method2");
			}
			@Override
			public void method3(){}
		});
		operator1.method2();
		//使用缺省适配器类
		Target operator2 = new Operator(new DefaultAdapter(){
			@Override
			public void method2(){
				System.out.println("method2");
			}
		});
		operator2.method2();
		
    }
}
//目标
interface Target{
	void method1();
	void method2();
	void method3();
}
//缺省适配器类
abstract class DefaultAdapter implements Target{
	@Override
	public void method1(){}
	@Override
	public void method2(){}
	@Override
	public void method3(){}
}
class Operator implements Target{
	Target target;
	public Operator(Target target){
		this.target = target;
	}
	@Override
	public void method1(){
		target.method1();
	}
	@Override
	public void method2(){
		target.method2();
	}
	@Override
	public void method3(){
		target.method3();
	}
}

When & Where
系统需要使用已经存在的类,功能符合系统要求,但这个类的接口不符合系统的需求,通过适配器模式解决不兼容的问题,使这些功能类得到复用。

参考链接 设计模式 | 适配器模式及典型应用

结束语优秀是一种习惯。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值