动态代理

举个例子:比如有几个类Cat、Dog、Tiger,这几个类中分别有miao、wang、wuuu这几个方法,那么从容器中取出组件,调用这几个方法的时候(注意不是容器初始化时),miao、wang、wuuu这几个方法执行之前都会输出hello,执行之后都会输出world

public class CustomBeanPostProcessor implements BeanPostProcessor{
    //了解生存周期
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)  {
        Object change = Enhancer.create(bean.getClass(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("hello ");
                Object invoke = method.invoke(bean,objects);
                System.out.println(" world");
                return invoke;
            }
        });

        return change;
    }
}
    <bean id="cat" class="com.cskaoyan.day2.Cat"></bean>
    <bean id="dog" class="com.cskaoyan.day2.Dog"></bean>
    <bean class="com.cskaoyan.day2.CustomBeanPostProcessor"/>
 @Test
    public void mytest2(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
        Cat cat1 = applicationContext.getBean(Cat.class);
        cat1.say();
        Dog dog = applicationContext.getBean(Dog.class);
        dog.say();
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是采用介者模式进行重构的Java代码实现: ```java public interface AnimalMediator { void play(); void feed(String animalType); void sleep(String animalType); } public class AnimalGame implements AnimalMediator { private Tiger tiger; private Dog dog; private Cat cat; public AnimalGame(Tiger tiger, Dog dog, Cat cat) { this.tiger = tiger; this.dog = dog; this.cat = cat; } @Override public void play() { System.out.println("开始玩耍!"); tiger.roar(); dog.bark(); cat.meow(); } @Override public void feed(String animalType) { System.out.println("给" + animalType + "喂食!"); switch (animalType) { case "Tiger": tiger.eat(); break; case "Dog": dog.eat(); break; case "Cat": cat.eat(); break; default: System.out.println("无法识别的动物类型!"); } } @Override public void sleep(String animalType) { System.out.println(animalType + "开始睡觉!"); switch (animalType) { case "Tiger": tiger.rest(); break; case "Dog": dog.rest(); break; case "Cat": cat.rest(); break; default: System.out.println("无法识别的动物类型!"); } } } public abstract class Animal { protected AnimalMediator mediator; protected String type; public Animal(String type, AnimalMediator mediator) { this.type = type; this.mediator = mediator; } public abstract void eat(); public abstract void rest(); } public class Tiger extends Animal { public Tiger(AnimalMediator mediator) { super("Tiger", mediator); } public void roar() { System.out.println("老虎咆哮!"); } @Override public void eat() { System.out.println("老虎吃肉!"); } @Override public void rest() { System.out.println("老虎躺下休息!"); } } public class Dog extends Animal { public Dog(AnimalMediator mediator) { super("Dog", mediator); } public void bark() { System.out.println("狗叫汪汪!"); } @Override public void eat() { System.out.println("狗啃骨头!"); } @Override public void rest() { System.out.println("狗趴下休息!"); } } public class Cat extends Animal { public Cat(AnimalMediator mediator) { super("Cat", mediator); } public void meow() { System.out.println("猫叫喵喵!"); } @Override public void eat() { System.out.println("猫吃鱼!"); } @Override public void rest() { System.out.println("猫卧下休息!"); } } public class Main { public static void main(String[] args) { Tiger tiger = new Tiger(new AnimalGame(tiger, dog, cat)); Dog dog = new Dog(new AnimalGame(tiger, dog, cat)); Cat cat = new Cat(new AnimalGame(tiger, dog, cat)); AnimalMediator mediator = new AnimalGame(tiger, dog, cat); mediator.play(); mediator.feed("Tiger"); mediator.feed("Dog"); mediator.feed("Cat"); mediator.sleep("Tiger"); mediator.sleep("Dog"); mediator.sleep("Cat"); } } ``` 在这个重构后的设计介者模式被用于减少三个动物类之间的耦合。在这种模式下,AnimalMediator 接口充当介者角色,AnimalGame 实现了介者接口。每个动物类都持有介者的引用,并通过介者来与其他动物类进行通信。当需要进行玩耍、喂食或休息时,动物类会向介者发送请求,介者会根据请求型来调用相应的方法。这样,每个动物类都可以专注于自己的功能,而不需要关心其他动物类的状态和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值