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();
    	}
    }
    
    狗增加了
    吃的功能
    玩的功能
    睡的功能
    


  • 相关阅读:
    python 查看安装包列表
    Centos7 linux下通过源码安装redis以及使用
    python 安装pip
    python3.7.2 pip 出现locations that require TLS/SSL异常处理方法
    Xshell报错“The remote SSH server rejected X11 forwarding request.”
    ERROR: child process failed, exited with error number 100
    centos7 (ifconfig不能使用) -bash: ifconfig: command not found
    gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now
    Centos7 安装python3.7.2
    Python安装常见问题:zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
  • 原文地址:https://www.cnblogs.com/Howlet/p/12311094.html
Copyright © 2011-2022 走看看