zoukankan      html  css  js  c++  java
  • 类模式用Bridge模式重写了Libvirt框架

    这几周一直在研究类模式之类的问题,上午正好有机会和大家讨论一下.

        前一个项目我们引用了开源软件Libvirt,Libvirt的实现非常不错,可以支撑很多的Hypervisor。这两天再把设计模式翻出来看看,发明本来Libvirt是使用了Bridge设计模式,和Service Provider模式还有一定的区别,特用Java提供了框架如下:

        

        Connect.java:这个类在Bridge模式中没有对应观点

    package com.cisco.gendwang;
    
    public class Connect 
    {
    }

        

        Driver.java:这个类在Bridge模式中相当于Implementator

        

    package com.cisco.gendwang;
    
    public interface Driver 
    {
    	Connect open(String url);
    	String getHostName(Connect conn);
    	void close(Connect conn);
    }

        

        EsxiDriver.java:这个类在Bridge模式中相当于ConcreteImplementator1

        

    package com.cisco.gendwang;
    
    public class EsxiDriver implements Driver 
    {
    	public EsxiDriver()
    	{
    		System.out.println("ESXi driver is loaded");
    	}
    	
    	public Connect open(String url)
    	{
    		System.out.println("Get an ESXi connection");
    		return new Connect();
    	}
    	
    	public String getHostName(Connect conn)
    	{
    		System.out.println("Host Name: CRDC-21");
    		return "CRDC-21";
    	}
    	
    	public void close(Connect conn)
    	{
    		System.out.println("Close an ESXi connection");
    	}
    }

        

        

        XenDriver.java:这个类在Bridge模式中相当于ConcreteImplementator2

        

    package com.cisco.gendwang;
    
    public class XenDriver implements Driver 
    {
    	public XenDriver()
    	{
    		System.out.println("XEN driver is loaded");
    	}
    	
    	public Connect open(String url)
    	{
    		System.out.println("Get an XEN connection");
    		return new Connect();
    	}
    	
    	public String getHostName(Connect conn)
    	{
    		System.out.println("Host Name: CRDC-90");
    		return "CRDC-90";
    	}
    	
    	public void close(Connect conn)
    	{
    		System.out.println("Close an XEN connection");
    	}
    }
        每日一道理
    如果说友谊是一颗常青树,那么,浇灌它的必定是出自心田的清泉;如果说友谊是一朵开不败的鲜花,那么,照耀它的必定是从心中升起的太阳。 多少笑声都是友谊唤起的,多少眼泪都是友谊揩干的。友谊的港湾温情脉脉,友谊的清风灌满征帆。友谊不是感情的投资,它不需要股息和分红。(友谊可以换其他词语)

        

        

        

        Libvirt.java:这个类在Bridge中相当于Abstraction

        

    package com.cisco.gendwang;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class Libvirt 
    {
    	private Driver driver;
    	private static final Map<String, Driver> drivers = new HashMap<String, Driver>();
    	
    	public static void registerDriver(String driverName, Driver driver)
    	{
    		drivers.put(driverName.toLowerCase(), driver);
    	}
    	
    	public Connect virConnectOpen(String url)
    	{
    		int colonIndex = url.indexOf(":");
    		if(colonIndex == -1)
    		{
    			return null;
    		}
    		
    		String prefix = url.substring(0, colonIndex);
    		
    		driver = drivers.get(prefix.toLowerCase());
    		
    		return driver.open(url);
    	}
    	
    	public String virGetHostName(Connect conn)
    	{
    		return driver.getHostName(conn);
    	}
    	
    	public void virConnectClose(Connect conn)
    	{
    		driver.close(conn);
    	}
    }

        Application.java: 这个类在Bridge中是Client

    package com.cisco.gendwang;
    
    public class Application 
    {
    	public static void main(String[] args)
    	{
    		Libvirt.registerDriver("ESXi", new EsxiDriver());
    		Libvirt.registerDriver("XEN", new XenDriver());
    		
    		Libvirt libvirt1 = new Libvirt();
    		Connect conn1 = libvirt1.virConnectOpen("xen://10.74.125.90");
    		libvirt1.virGetHostName(conn1);
    		libvirt1.virConnectClose(conn1);
    		
    		Libvirt libvirt2 = new Libvirt();
    		Connect conn2 = libvirt2.virConnectOpen("esxi://10.74.125.21");
    		libvirt2.virGetHostName(conn2);
    		libvirt2.virConnectClose(conn2);
    	}
    }

    文章结束给大家分享下程序员的一些笑话语录: 警告
    有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他 说, “你知道不知道这个东西会危害你的健康?我是说, 你有没有注意到香烟 盒上的那个警告(Warning)?”
    小伙子说,“没事儿,我是一个程序员”。
    那妇女说,“这又怎样?”
    程序员说,“我们从来不关心 Warning,只关心 Error”

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3093595.html
Copyright © 2011-2022 走看看