Java基础之策略模式与代理模式

文章介绍了策略模式和代理模式的概念及其应用场景。策略模式允许在运行时改变对象的行为,避免了多重条件判断,适用于需要动态选择算法的场景。代理模式则为对象提供一个代理以扩展其功能,静态代理是通过接口实现,文中展示了如何创建代理接口、被代理类和代理类的过程。
摘要由CSDN通过智能技术生成

目录

1. 策略模式

2. 代理模式(Proxy)

2.1 静态代理设计模式


1. 策略模式

        在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型

模式。策略模式将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大

的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使

得算法可独立于使用它的用户而变化。

        优点: 算法可以自由切换;避免使用多重条件判断;扩展性良好。

        缺点: 策略类会增多;所有策略类都需要对外暴露。

        使用场景: 

        1、如果在一个系统里面有许多类,它们之间的区别在于它们的行为,那么使用

策略模式可以动态地让一个对象在许多行为中选择一种行为。

        2、一个系统需要动态地在几种算法中选择一种。

        3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择

语句来实现。

 

2. 代理模式(Proxy

        代理设计模式就是为当前对象找一个代理对象,帮当前对象做一些其他的功能。

        代理对象 就是 当前对象功能的扩展。

        代理模式的分类:静态代理动态代理。

            静态代理:编写一个代理类。实现对被代理类的功能的扩展。

            动态代理:代理类是在程序运行过程,动态生成的类,实现对被代理类的功能的扩展。

        使用继承实现功能扩展:

/**
 * 目标类。也称为被代理类
 */
public class A {
    public void fun(){
        System.out.println("A.fun()!!!");
    }
}

/**
 * 代理类,子类。
 */
public class ProxyA extends A{
    @Override
    public void fun() {
        super.fun();
        proxyFun();
    }
    public void proxyFun(){
        System.out.println("ProxyA.proxyFun()!!");
    }
}

public static void main(String[] args) {
    A a = new ProxyA();//被代理指向代理类(父类引用指向子类实例)
    a.fun();
}

输出:A.fun()!!!

           ProxyA.proxyFun()!!

 

2.1 静态代理设计模式

编写代理接口:用来暴露需要被代理的方法

public interface Proxy {
    void fun();//被代理方法
}

编写被代理类:

/**
 * 目标类,被代理类
 */
public class Service implements Proxy {
    @Override
    public void fun() {
        System.out.println("被代理的fun()");
    }
}

编写代理类:

        静态代理模式是针对接口实现的代理。

        与被代理类实现同一个代理接口;在代理类中编写代理接口的属性做为 被代理对象。 

/**
 * 代理类
 */
public class ProxyImpl implements Proxy {
    private Proxy proxyTarget;//被代理对象
    public ProxyImpl(Proxy proxyTarget) {
        this.proxyTarget = proxyTarget;
    }
    @Override
    public void fun() {
        System.out.println("功能之前的功能扩展!!!");
        proxyTarget.fun();
        System.out.println("功能之后的功能扩展!!!");
    }
}

编写测试类:

public static void main(String[] args) {
    Service service = new Service();//被代理对象。
    ProxyImpl proxyImpl = new ProxyImpl(service);//代理对象, service是确定的,不可随意更改
    proxyImpl.fun();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值