zoukankan      html  css  js  c++  java
  • 接口(工厂模式&代理模式)

    程序1:简单的接口功能

    package com.liaojianya.chapter2;
    /**
     * 编写程序实现一个usb接口,定义设备来使用这个接口,从而计算机可以调用具有usb接口的设备。
     * @author LIAO JIANYA
     * 2016年7月27日
     */
    public class InterfaceStandards
    {
    	public static void main(String[] args)
    	{
    		Computer com = new Computer();
    		com.plugin(new Flash());//在电脑上使用U盘
    		com.plugin(new Print());//在电脑上使用打印机
    	}
    
    }
    //定义USB接口标准
    interface USB
    {
    	public void work();
    }
    //在电脑上使用具有USB接口的设备
    class Computer
    {
    	public void plugin(USB usb)
    	{
    		usb.work();
    	}
    }
    //打印机实现USB接口标准
    class Print implements USB
    {
    	public void work()
    	{
    		System.out.println("打印机用USB接口,连接开始工作");
    	}
    }
    //U盘实现USB接口标准
    class Flash implements USB
    {
    	public void work()
    	{
    		System.out.println("U盘使用USB接口,连接开始工作");
    	}
    }
    

      运行结果:

    U盘使用USB接口,连接开始工作
    打印机用USB接口,连接开始工作
    

      分析:

      按照固定的USB接口标准,可以定义无数多个子类,并且这些子类可以在电脑上使用。

      程序2:工厂模式

    package com.liaojianya.chapter2;
    /**
     * 
     * @author LIAO JIANYA
     * 2016年7月27日
     */
    public class SimpleFactoryTest
    {
    	public static void main(String[] args)
    	{
    		Animal an = Factory.getInstance("lion");
    		an.behaviour();
    		an = Factory.getInstance("bird");
    		an.behaviour();
    	}
    
    }
    //定义一个动物标准
    interface Animal
    {
    	public void behaviour();
    }
    
    class Lion implements Animal
    {
    	public void behaviour()
    	{
    		System.out.println("狮子跑");
    	}
    }
    
    class Bird implements Animal
    {
    	public void behaviour()
    	{
    		System.out.println("鸟儿飞");
    	}
    }
    class Factory
    {
    	public static Animal getInstance(String className)
    	{
    		if("lion".equals(className))
    		{
    			return new Lion();
    		}
    		if("bird".equals(className))
    		{
    			return new Bird();
    		}
    		return null;
    	}
    }
    

      运行结果:

    狮子跑
    鸟儿飞
    

      分析:

      1)根据参数的内容实例化不同的子类,参数内容为“lion”,实例化的就是Lion类,参数内容为“bird”,实例化的就是Bird类,所以输出内容也不同。

      2)此时的程序,客户端没有呵呵具体的子类耦合在一起,这样,如果再有更多的Animal接口的子类粗线,只需要修改Factory类即可,即所有的接口对象都是通过Factory类取得。

      程序3:代理设计模式

    package com.liaojianya.chapter2;
    /**
     * 设计代理模式,用红酒厂商、代理商、客户来阐释代理的作用
     * @author LIAO JIANYA
     * 2016年7月27日
     */
    public class ProxyTest
    {
    	public static void main(String[] args)
    	{
    		Subject sub = new ProxySubject();//客户直接找代理,子类为接口实例化
    		sub.request();
    	}
    
    }
    //代理请求
    abstract class Subject
    {
    	abstract public void request();
    }
    //真实角色(红酒厂商)
    class RealSubject extends Subject
    {
    	public void request()
    	{
    		System.out.println("我是红酒厂商,欢迎品尝购买!");
    	}
    }
    //代理角色(代理商)
    class ProxySubject extends Subject
    {
    	private RealSubject realSubject;
    	public void request()
    	{
    		preRequest();
    		if(realSubject == null)
    		{
    			realSubject = new RealSubject();
    		}
    		realSubject.request();
    		postRequest();
    	}
    	private void preRequest()
    	{
    		System.out.println("前期宣传活动,免费品尝");
    	}
    	private void postRequest()
    	{
    		System.out.println("结束宣传活动,付费购买");
    	}
    }
    

       运行结果:

    前期宣传活动,免费品尝
    我是红酒厂商,欢迎品尝购买!
    结束宣传活动,付费购买
    

      分析:代理设计模式的核心组成部分:一个接口两个子类,一个子类负责真实的业务操作功能,如红酒厂商;一个子类负责完成与真实业务相关的操作,如红酒代理商。

      程序4:接口与抽象类设计

    package com.liaojianya.chapter2;
    
    import java.util.Scanner;
    
    /**
     * 利用接口及抽象类设计实现:
     * 1)定义接口圆形CircleShape,其中定义常量PI,提供方法computeArea()计算面积
     * 2)定义圆形类Circle实现接口CircleShape,包含构造方法和求圆形周长方法;
     * 3)定义圆柱继承Cicle实现接口CircleShape,包含构造方法,圆柱表面积,体积;
     * 4)从控制台输入圆半径,输出圆面积及周长;
     * 5)从控制台输入圆柱底面半径及高,输出圆柱底面积、圆柱表面积及体积。
     * @author LIAO JIANYA
     * 2016年7月27日
     */
    public class InterfaceAndAbstract
    {
    	public static void main(String[] args)
    	{
    		Scanner san = new Scanner(System.in);
    		System.out.println("输入圆的半径:");
    		double r = san.nextDouble();
    		Circle circle = new Circle(r);
    		System.out.println("圆的面积为:" + circle.computeArea() 
    			+ ",圆的周长为:" + circle.computeGirth());
    		System.out.println("输入圆柱底面半径:");
    		r = san.nextDouble();
    		System.out.println("输入圆柱高:");
    		double h = san.nextDouble();
    		Cylinder cylinder = new Cylinder(r, h);
    		System.out.println("圆柱的底面积为: " + cylinder.computeBaseArea() 
    			+ ",圆柱的表面积为:" + cylinder.computeSurfaceArea()
    			+ ",圆柱的体积为:" + cylinder.computeVolune());
    		san.close();
    	}
    
    }
    
    interface CircleShape
    {
    	public static final double PI = 3.14;
    	public double computeArea();
    }
    
    class Circle implements CircleShape
    {
    	double area;
    	double girth;
    	double r;
    	public Circle(double r)
    	{
    		this.r = r;
    	}
    	public double computeArea()
    	{
    		return area = PI * r * r;
    		
    	}
    	
    	public double computeGirth()
    	{
    		return girth = 2 * PI * r;
    	}
    }
    
    class Cylinder extends Circle implements CircleShape
    {
    	double baseArea;
    	double sufaceArea;
    	double volume;
    	double h;
    	public Cylinder(double r, double h)
    	{
    		super(r);
    		this.h = h;
    	}
    	
    	public double computeBaseArea()
    	{
    		return baseArea = super.computeArea();
    	}
    	
    	public double computeSurfaceArea()
    	{
    		return sufaceArea = super.computeGirth() * h;
    	}
    	
    	public double computeVolune()
    	{
    		return volume = baseArea * h;
    	}
    }
    

      运行结果:

    输入圆的半径:
    1
    圆的面积为:3.14,圆的周长为:6.28
    输入圆柱底面半径:
    1
    输入圆柱高:
    2
    圆柱的底面积为: 3.14,圆柱的表面积为:12.56,圆柱的体积为:6.28
    

      

  • 相关阅读:
    aptget 的使用
    NetScaler
    This Android SDK requires Android Developer Toolkit version 10.0.0 or above
    创建menu的时候为什么要用Menu.FIRST常量?
    SQLServer中char、varchar、nchar、nvarchar的区别
    HTTP响应头信息和请求头信息详解
    第十一章 常见字词误用的情形 《英语科技写作(文法与修辞原则)》by 方克涛
    Random类不能产生随机数的情况测试
    将Web Services封装到一个dll
    在DataTable中查找
  • 原文地址:https://www.cnblogs.com/Andya/p/5709937.html
Copyright © 2011-2022 走看看