随机名言

桥接模式



1. 桥接模式(Bridge Pattern)

桥接模式是一种对象结构型模式,是将抽象部分与它的实现部分 分离,使它们都可以独立地变化,其主要对象有:

  • Abstraction:抽象类
  • RefinedAbstraction:抽象类的具体实现
  • Implementor:实现类接口
  • ConcreteImplementor:具体实现类

JDBC中,Class.forName(“com.mysql.jdbc.Driver”),加载类的静态代码块就使用了桥接模式



2. 流程

举例需求:这里有猫和狗,猫会这个功能,狗会这个功能,但不满足于此,怎么给猫和狗增加一个功能呢?这里增加一个鸟动物,鸟增加一个功能怎么实现?这种动物功能互相组合可以用桥接模式来实现


2.1 实现类接口

public interface AbstractFunction {
	
	public abstract void doFunction();
}

2.2 具体实现类

// 吃功能
public class EatFun implements AbstractFunction {

	@Override
	public void doFunction() {
		System.out.println("吃的功能");
	}
}
// 玩功能
public class PlayFun implements AbstractFunction {

	@Override
	public void doFunction() {
		System.out.println("玩的功能");
	}
}
// 睡功能
public class SleepFun implements AbstractFunction {

	@Override
	public void doFunction() {
		System.out.println("睡的功能");
	}
}

2.3 抽象类

public abstract class AbstractAnimal {
	
	private AbstractFunction af;
	
	public void setAf(AbstractFunction af) {
		this.af = af;
	}

	public abstract void doSomething();
}

2.4 抽象类的具体实现

// 猫
public class CatAnimal extends AbstractAnimal {

	@Override
	public void doSomething() {
		System.out.println("猫增加了");
		af.doFunction();
	}
}
// 狗
public class DogAnimal extends AbstractAnimal {

	@Override
	public void doSomething() {
		System.out.println("狗增加了");
		af.doFunction();
	}
}

2.5 测试

public class test {
	
	public static void main(String[] args) {
		
		PlayFun pf = new PlayFun();
		CatAnimal cat = new CatAnimal();
		
		cat.setAf(pf);
		cat.doSomething();
		
		System.out.println("\n---------人工分割线-----------\n");
		
		EatFun ef = new EatFun();
		DogAnimal dog = new DogAnimal();
		
		dog.setAf(ef);
		dog.doSomething();
		System.out.println("---------人工分割线-----------");
		dog.setAf(pf);
		dog.doSomething();
	}
}
猫增加了
玩的功能

---------人工分割线-----------

狗增加了
吃的功能
---------人工分割线-----------
狗增加了
玩的功能


3. 动态扩展

改动抽象类

public abstract class AbstractAnimal {
	
    // 内部维护功能集合
	public ArrayList<AbstractFunction> af = new ArrayList();
	
    // 添加元素
	public void addAf(AbstractFunction af) {
		this.af.add(af);
	}

	public abstract void doSomething();
}

改动测试类

public class test {
	
	public static void main(String[] args) {
		
		EatFun ef = new EatFun();
		PlayFun pf = new PlayFun();
		SleepFun sf = new SleepFun();
		
		DogAnimal dog = new DogAnimal();
		dog.addAf(ef);
		dog.addAf(pf);
		dog.addAf(sf);
		
		dog.doSomething();
	}
}
狗增加了
吃的功能
玩的功能
睡的功能


posted @ 2020-02-15 11:46  Howlet  阅读(135)  评论(0编辑  收藏  举报

Copyright © By Howl