zoukankan      html  css  js  c++  java
  • 桥接模式



    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("
    ---------人工分割线-----------
    ");
    		
    		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();
    	}
    }
    
    狗增加了
    吃的功能
    玩的功能
    睡的功能
    


  • 相关阅读:
    android中给TextView或者Button的文字添加阴影效果
    android:layout_weight详解
    android Button 颜色的变化(点击,放开,点击不放)
    Android之最简单的ImageView加边框方法
    泳道图
    使用Navicat生成ER关系图并导出
    IDEA须知
    Error running Tomcat8: Address localhost:1099 is already in use(IDEA错误)
    3分钟打动投资人:商业计划书篇
    HTML按钮属性
  • 原文地址:https://www.cnblogs.com/Howlet/p/12311094.html
Copyright © 2011-2022 走看看