• 设计模式-8-适配器模式-继承


    简介:将类自己的接口包裹在一个已存在的类中

    目的:让一个类即有原有类的功能,又能实现某个接口

    总结:通过继承+实现,使类具有被继承类和接口的功能

    组成:继承+实现类

    缺点:实现接口后,子类有不该实现的方法产生

    举例:让HashMap成为观察者,被观察者发生变化,HashMapi做出相应处理

    1,基础类

    观察者

    package com.design.h.adapter.classs;
    /**
     * 观察者接口
     */
    public interface ObserverService {
        
        /**
         * 被观察者发生改变需要观察者执行的动作
         */
        Boolean update();
    
    }
    package com.design.h.adapter.classs;
    
    /**
     * 观察者A
     */
    public class ObserverAServiceImpl implements ObserverService {
    
        @Override
        public Boolean update() {
            System.out.println("收到被观察者的变化    --> 观察者A  -->  相应的处理 ");
            return true;
        }
    
    }
    package com.design.h.adapter.classs;
    
    /**
     * 观察者B
     */
    public class ObserverBServiceImpl implements ObserverService {
    
        @Override
        public Boolean update() {
            System.out.println("收到被观察者的变化    --> 观察者B  -->  相应的处理 ");
            return true;
        }
    
    }

    被观察者

    package com.design.h.adapter.classs;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 被观察者
     */
    public class Observable {
        
        
        //1-记录观察者
        private List<ObserverService> observers = new ArrayList<ObserverService>();
        public Boolean addObserver(ObserverService observerService){
            return observers.add(observerService);
        }
        
        
        //2-发生改变的动作
        public void changed(){
            System.out.println("被观察者已发生变化   ... ... ");
            notifyObserver();
            
        }
        
        //3-通知观察者
        private void notifyObserver(){
            System.out.println("被观察者开始通知观察者   ... ... ");
            for(ObserverService observerService : observers){
                observerService.update();
            }
        }
    
    }

    2,继承+实现类

    package com.design.h.adapter.classs;
    
    import java.util.HashMap;
    /**
     * 使用适配器模式  - 让HashMap成为观察者
     * 
     * HashMap没有实现Observer接口无法使用观察者模式  - 但是通过适配器可以实现该功能
     * 
     * @param <K>
     * @param <V>
     */
    public class HashMapObserverAdapter<K, V> extends HashMap<K, V> implements ObserverService {
    
        private static final long serialVersionUID = 8102076452770429152L;
    
        @Override
        public Boolean update() {
            
            System.out.println("收到被观察者的变化    --> HashMap适配器  -->  相应的处理   <清空Map> ");
            //被观察者发生变化-清空Map
            super.clear();
            return false;
        }
    
    }

    3,Main

    package com.design.h.adapter.classs;
    /**
     * 适配器模式 - 类适配器(继承)
     * 
     * 需求:需要HashMap这种源码中的类支持观察者模式,因为HashMap没有实现观察者接口ObserverService不能直接观察,所以必须使用适配器模式实现
     *     HashMapObserverAdapter先继承HashMap拥有HashMap功能,然后实现观察者接口ObserverService
     * 
     * 实现方式:1-类适配器(继承)    2-对象适配器(组合)
     * 使用目的:1-特殊适配器(复用原有代码)   2-缺省适配器(避免子类实现不该实现的方法)
     */
    public class MainTest {
        
        public static void main(String[] args) {
            
            /**
             * 观察者模式-自定义
             */
            //1-创建观察者
            ObserverService observerA = new ObserverAServiceImpl();
            ObserverService observerB = new ObserverBServiceImpl();
            
            /**
             * HashMap适配器  - 使用HashMap成为观察者
             */
            @SuppressWarnings("rawtypes")
            HashMapObserverAdapter hashMapObserverAdapter = new HashMapObserverAdapter();
            
            //2-向被观察者添加观察者
            Observable observed = new Observable();
            observed.addObserver(observerA);
            observed.addObserver(observerB);
            
            /**
             * HashMap适配器加入到观察者列表
             */
            observed.addObserver(hashMapObserverAdapter);
            
            //3-触发被观察者发生改变,通知观察者
            observed.changed();
        }
    
    }

    4,Result

    被观察者已发生变化   ... ... 
    被观察者开始通知观察者   ... ... 
    收到被观察者的变化    --> 观察者A  -->  相应的处理 
    收到被观察者的变化    --> 观察者B  -->  相应的处理 
    收到被观察者的变化    --> HashMap适配器  -->  相应的处理   <清空Map> 
  • 相关阅读:
    iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解
    iOS开发~UI布局(一)初探Size Class
    OC登陆界面登陆按钮动画
    Git学习 --> 个人常用命令add,commit以及push
    Git使用之设置SSH Key
    【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)
    iOS网络检测Reachability 使用 Demo,可检测2、3、4G
    iOS提醒用户进入设置界面进行重新授权通知定位等功能
    iOS中 @synthesize 和 @dynamic 区别
    iOS 开发笔记
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/7206245.html
Copyright © 2020-2023  润新知