美文网首页Java后端
Java反射与观察者模式

Java反射与观察者模式

作者: 大数据阶梯之路 | 来源:发表于2018-11-10 15:02 被阅读18次

    一、Java反射技术

    Java反射的最大好处是可以通过配置生成对象,解除程序的耦合度,程序显得灵活易用。不过缺点是程序运行比较慢,但很多情况下为了灵活度,还是会使用反射,springIOC容器就是一大应用。

    下面为反射生成无构造方法参数的类对象

    //反射实现类
    public class ReflectServiceImpl {
        public void sayHello(String name){
            System.out.println("Hello" + name + "by Reflect");
        }
    }
    
     //反射生成对象
        public ReflectServiceImpl getInstance(){
            ReflectServiceImpl reflectService = null;
            try{
                //给类加载器注册一个ReflectServiceImpl全限定名,再newInstance()初始化一个类对象
                reflectService = (ReflectServiceImpl) Class.forName("ReflectServiceImpl").newInstance();
            }catch(ClassNotFoundException | InstantiationException | IllegalAccessException ex){
                ex.printStackTrace();
            }
            return reflectService;
        }
    

    但如果类的构造方法带有参数,即

    //反射实现类
    public class ReflectServiceImpl {
        private String name;
        public ReflectServiceImpl(String name){
            this.name = name;
        }
    }
    

    则改变一下上面反射生成对象的一行代码即可,通过getConstructor()方法

     //给类加载器注册一个ReflectServiceImpl全限定名,再newInstance()初始化一个类对象
     reflectService = (ReflectServiceImpl) Class.forName("ReflectServiceImpl").getConstructor(String.class).newInstance("小江");
    
    反射方法,下面以一个实例来演示
    //反射实现类
    public class ReflectServiceImpl {
        public void sayHello(String name){
            System.out.println("Hello " + name +" by Reflect");
        }
    }
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Main {
        public static void main(String[] args) {
            ReflectServiceImpl object = null;
            try{
                object = (ReflectServiceImpl) Class.forName("ReflectServiceImpl").newInstance();
                Method method = object.getClass().getMethod("sayHello", String.class);
                method.invoke(object,"小江");
            }catch(ClassNotFoundException | IllegalAccessException | NoSuchMethodException
                    | InstantiationException | InvocationTargetException ex){
                ex.printStackTrace();
            }
            return;
        }
    }
    

    二、观察者模式(Observer)

    观察者定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者状态发生变化时,会通知所有观察者,并让其自动更新自己。

    如下实例,演示观察者模式

    //实现观察者接口——京东接口
    public class JingDongObserver implements Observer {
        @Override
        public void update(java.util.Observable o, Object product) {
            String newProduct = (String) product;
            System.out.println("发送新产品【"+newProduct+"】同步到京东商城");
        }
    }
    //实现观察者接口——淘宝接口
    public class TaoBaoObserver implements Observer {
        @Override
        public void update(Observable o, Object product) {
            String newProduct = (String) product;
            System.out.println("发送新产品【"+newProduct+"】同步到淘宝商城");
        }
    }
    

    下面是一个被观察者类,当观察者发生了变化则告知观察者,如果没有则无法触发setChanged方法

    //被观察者类
    public class ProductList extends Observable {
        private List<String> productList = null; //定义产品列表
        private static ProductList instance;  //类唯一实例
    
        private ProductList(){     //构造方法私有化,单例模式的应用,避免直接通过new方式创建对象
    
        }
        //返回产品列表唯一实例
        public static ProductList getInstance(){
            if(instance == null){
                instance = new ProductList();
                instance.productList = new ArrayList<String>();
            }
            return instance;
        }
        //增加观察者(电商接口)
        public void addProductListObserver(Observer observer){
            this.addObserver(observer);
        }
        //新增产品
        public void addProudct(String newProduct){
            productList.add(newProduct);
            System.out.println("产品列表新增了产品:" + newProduct);
            this.setChanged();   //设置被观察者发生变化的状态
            this.notifyObservers(newProduct);  //通知观察者,并传递新产品
        }
    }
    

    最后用一个main方法来测试调用它

    public class Main {
        public static void main(String[] args) {
            ProductList observable = ProductList.getInstance();
            JingDongObserver jingDongObserver = new JingDongObserver();
            TaoBaoObserver taoBaoObserver = new TaoBaoObserver();
            //对被观察者注册观察者
            observable.addProductListObserver(jingDongObserver);
            observable.addProductListObserver(taoBaoObserver);
            observable.addProudct("小米手环");
        }
    }
    

    运行结果截图:


    图片.png
    持续学习更新,喜欢地可以点个喜欢,谢谢哟

    相关文章

      网友评论

        本文标题:Java反射与观察者模式

        本文链接:https://www.haomeiwen.com/subject/uvezxqtx.html