java设计模式---桥接模式

桥接模式的英文是 Bridge ,桥接模式关注抽象的设计。抽象是指包含了一组抽象方法的类,这些抽象方法可能包含多个实现。

实现抽象的一般做法是创建类的层次结构,该层次结构的顶部是一个包含抽象方法的抽象类,该类的每一个子类都提供这些抽象方法的不同实现。但是,当需要对该层次进行子类化时,这一做法就存在不足了。

你可以创建一个桥,然后把这些抽象方法移到接口中,这样,抽象就依赖于接口的实现。

桥接模式的意图是:将抽象与抽象方法的实现相互分离来实现解耦,以便二者可以相互独立的变化。


上面这段话的意思就是说实现与抽象相分离。

下面举个例子说明:

1.现在水果里有 苹果和橘子

2.人分为 男人和女人

3.人都可以吃水果,所以有 2*2 = 4 中情况


如果我们不用桥接模式,那么实现这么多情况就需要一个一个的去实现,也就是4类,那么我们使用桥接模式呢?答案是:2类。这在条件和实现比较多的情况下优势会更明显。


具体的实现:

下面首先给出实现的UML图

java设计模式---桥接模式_第1张图片

实现的代码和说明如下:

1.Fruit类

package com.brucezhang.bridge;

public abstract class Fruit {
	
	/**
	 * 抽象方法
	 * @param People
	 * */
	
	public abstract void eatFruit(People people);
}

这是一个抽象类,是所有水果的抽象,其中的一个抽象方法是对水果执行的动作,也就是将来我们需要对水果执行的操作,参数是人。


2.Apple类

package com.brucezhang.bridge;

public class Apple extends Fruit{

	@Override
	public void eatFruit(People people) {
		// TODO Auto-generated method stub
		System.out.println(people.getType() + " eat apple !");
	}

}

3.Oranger类

package com.brucezhang.bridge;

public class Oranger extends Fruit{

	@Override
	public void eatFruit(People people) {
		// TODO Auto-generated method stub
		System.out.println(people.getType() + " eat oranger !");
	}

}

这两个类都是水果类的具体实现,都代表的具体的东西,其中需要重载水果类中的抽象方法,且各自都有各自不同的实现。


4.People类

package com.brucezhang.bridge;

public abstract class People {

	private String type;
	private Fruit fruit;
	
	
	public String getType() {
		return type;
	}


	public void setType(String type) {
		this.type = type;
	}


	public Fruit getFruit() {
		return fruit;
	}


	public void setFruit(Fruit fruit) {
		this.fruit = fruit;
	}

	//抽象方法
	public abstract void eat();
	
	
}

这个类是抽象的人,里面有两个参数,一个参数是水果,一个参数是类型(代表是男人或是女人)


5.Man类

package com.brucezhang.bridge;

public class Man extends People{
	
	public Man(){
		setType("Man");
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		getFruit().eatFruit(this);
	}

}

6.Woman类

package com.brucezhang.bridge;

public class Woman extends People{
	
	public Woman(){
		setType("Woman");
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		getFruit().eatFruit(this);
	}
	
}

这两个类继承自People类,是具体的“人”,其中重写了父类方法,并在构造函数中说明是“什么人”


7.测试类--Main_Test

package com.brucezhang.bridge;

public class Main_Test {
	
	public static void main(String[] args) {
		
		People man = new Man();
		People woman = new Woman();
		
		Fruit apple = new Apple();
		Fruit oranger = new Oranger();
		
		apple.eatFruit(man);
		oranger.eatFruit(woman);
		apple.eatFruit(woman);
		oranger.eatFruit(man);
	}
}

这里是对桥接模式的测试。


程序执行的结果如下:

Man eat apple !
Woman eat oranger !
Woman eat apple !
Man eat oranger !


你可能感兴趣的:(java,设计模式,继承,UML,桥接模式)