桥接模式:将抽象部分与它的实现部分分离,使他们能够独立的变化。
合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
聚合表示的是一种弱的拥有关系,体现了A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的拥有关系,体现了严格的整体与部分的关系,部分与整体的生命周期是一样的。
抽象实例
Implementor.java
public abstract class Implementor {
public abstract void operation();
}
class ConcreteImplementA extends Implementor{
@Override
public void operation() {
System.out.println("具体实现类A的实现");
}
}
class ConcreteImplementB extends Implementor{
@Override
public void operation() {
System.out.println("具体实现类B的实现");
}
}
Abstraction.java
public class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor){
this.implementor=implementor;
}
public void operation(){
implementor.operation();
}
}
RefinedAbstraction.java
public class RefinedAbstraction extends Abstraction{
@Override
public void operation() {
implementor.operation();
}
}
Test.java
public class Test {
public static void main(String[] args) {
RefinedAbstraction refinedAbstraction = new RefinedAbstraction();
refinedAbstraction.setImplementor(new ConcreteImplementA());
refinedAbstraction.operation();
refinedAbstraction.setImplementor(new ConcreteImplementB());
refinedAbstraction.operation();
}
}
具体实例
手机与软件之间的聚合关系
HandSetSoft.java-手机软件
/**
* 手机软件
* @author Carl_Hugo
*/
public abstract class HandSetSoft {
public abstract void run();
}
class HandSetGame extends HandSetSoft{
@Override
public void run() {
System.out.println("运行手机游戏");
}
}
class HandSetAddressList extends HandSetSoft{
@Override
public void run() {
System.out.println("运行手机通讯录");
}
}
HandSetBrand.java-手机品牌
public abstract class HandSetBrand {
protected HandSetSoft soft;
//设置手机软件
public void setHandSetSoft(HandSetSoft soft){
this.soft=soft;
}
//运行
public abstract void run();
}
class HandSetBrandN extends HandSetBrand{
@Override
public void run() {
System.out.print("品牌N:");
soft.run();
}
}
class HandSetBrandM extends HandSetBrand{
@Override
public void run() {
System.out.print("品牌M:");
soft.run();
}
}
测试
public class Test {
public static void main(String[] args) {
HandSetBrand ab;
ab=new HandSetBrandN();
ab.setHandSetSoft(new HandSetGame());
ab.run();
ab.setHandSetSoft(new HandSetAddressList());
ab.run();
ab=new HandSetBrandM();
ab.setHandSetSoft(new HandSetGame());
ab.run();
ab.setHandSetSoft(new HandSetAddressList());
ab.run();
}
}
输出: