接口(工厂模式&代理模式)

程序1:简单的接口功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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接口,连接开始工作");
    }
}

  运行结果:

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

  分析:

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

  程序2:工厂模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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
2
狮子跑
鸟儿飞

  分析:

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

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

  程序3:代理设计模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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("结束宣传活动,付费购买");
    }
}

   运行结果:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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
2
3
4
5
6
7
8
输入圆的半径:
1
圆的面积为:3.14,圆的周长为:6.28
输入圆柱底面半径:
1
输入圆柱高:
2
圆柱的底面积为: 3.14,圆柱的表面积为:12.56,圆柱的体积为:6.28

  

posted @   Andya_net  阅读(4082)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示