• 复用


    1.里氏替换原则

    里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。

    类型替换:

    ①子类型只能增加而不能删除方法

    ②子类型需要实现抽象类中所有未实现的方法

    ③子类型中重写的方法,它的返回值必须是相等类型或是协变类型。

    ④子类型中重写的方法,它的返回值必须是相等类型或是逆变类型(java不支持)。

    ⑤子类型中重写的方法不能抛出额外的异常(必须是被重写方法抛出的异常及其子类)。

    方法重写:

    ①更强的不变量(规则限制)

    ②更弱的前置条件

    ③更强的后置条件

    2.协变、逆变

    协变:子类型代替父类型出现,更具体

    比如数组中相应子类型的数组引用可以传给父类型

    比如泛型中的通配符<?> <? extends xxx>

    逆变:父类型代替子类型出现,更抽象

    3.委托

    一个对象请求另一个对象的功能

    与继承相比,主要发生在对象层面,可以选择性的使用方法,比继承更自由。

    ①将其传入一个具体方法的参数,用完就解除关系。

    ②将其写入构造函数的参数中,并设立一个字段与委托对象建立联系。

    ③直接将其固定在一个字段中。

    ④将其写入一个字段中,并可通过set()方法更改。

    4.黑盒框架、白盒框架

    白盒框架:通过继承框架类,重写框架方法使用框架

    • 允许扩展每一个非私有方法
    • 需要理解父类的实现
    • 一次只进行一次扩展
    • 通常被认为是开发者框架

    黑盒框架:通过委派、组合、调用方法,使用框架类,内部不可见。

    • 允许在接口中对public方法扩展
    • 只需要理解接口
    • 通常提供更多的模块
    • 通常被认为是终端用户框架,平台

     5.常用接口、功能类总结

    Iterator、Iterable

    iterator是一个接口

    package java.util; 
    public interface Iterator<AnyType>
    { 
        boolean hasNext(); 
        AnyType next(); 
        void remove(); //上次next执行结果的元素
    }

    iterable是一个泛型接口

    package java.lang; 
    
    public interface Iterable<AnyType>
    { 
         Iterator<AnyType> iterator(); 
    } 

    删除元素的三种方式

    1.普通for循环

    2.迭代器删除

    Iterator<String> it = list.iterator();
    while(it.hasNext()) {
      if("b".equals(it.next())) {
        //list.remove("b");    //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
        it.remove();
      }
    }
    
    for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
      if("b".equals(it2.next())) {
        //list.remove("b");    //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
        it2.remove();
      }
    }

    3.另一种for循环

            for (String string : list) {
                if("b".equals(string)){
                    list.remove("b");
                }
            }

    Observer、Observable

    Observer:接口、观察者

    package java.util;
     public interface Observer {
         void update(Observable o, Object arg);
    }

    Observable:类、被观察者

    package java.util;
    
    public class Observable {
        private boolean changed = false;  //是否改变状态
        private Vector obs;    //Vector利用同步方法来线程安全,线程安全在多线程情况下不会造成数据混乱
    
        public Observable() {
            obs = new Vector();
        }
    
        public synchronized void addObserver(Observer o) {
            if (o == null)
                throw new NullPointerException();
            if (!obs.contains(o)) {
                obs.addElement(o);
            }
        }
    
        public synchronized void deleteObserver(Observer o) {
            obs.removeElement(o);
        }
    
        public void notifyObservers() {
            notifyObservers(null);
        }
    
        public void notifyObservers(Object arg) {
            Object[] arrLocal;
    
            synchronized (this) {
                if (!changed)    //状态值未改变时返回,不通知
                    return;
                arrLocal = obs.toArray();  //将Vector转换成数组
                clearChanged();    //重置状态
            }
    
            for (int i = arrLocal.length-1; i>=0; i--)
                ((Observer)arrLocal[i]).update(this, arg);
        }
    
        public synchronized void deleteObservers() {
            obs.removeAllElements();
        }
    
        protected synchronized void setChanged() {
            changed = true;
        }
    
        protected synchronized void clearChanged() {
            changed = false;
        }
    
        public synchronized boolean hasChanged() {
            return changed;
        }
    
        public synchronized int countObservers() {
            return obs.size();
        }
    }

    Comparable、Comparator

     Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

      此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。该接口定义如下:

    package java.lang;
    import java.util.*;
    public interface Comparable<T> 
    {
        public int compareTo(T o);
    }

    Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。该接口定义如下:

    package java.util;
    public interface Comparator<T>
     {
        int compare(T o1, T o2);
        boolean equals(Object obj);
     }

    注意:1、若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。

       2、int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

     排序

    数组排序:Array.sort(int[] a)

    集合排序:

    1. Collections.sort(List list)
    2. Collections.sort(List list,Comparator c)
  • 相关阅读:
    Python全栈-第六课 学习笔记
    python基础 day27 装饰器函数classmethod、staticmethod
    python基础 day26 面向对象-super方法、封装、property装饰器、反射
    python基础 day25 面向对象-继承2
    python基础 day24 面向对象-继承1
    python基础 day23 面向对象2
    python基础 day22 面向对象
    python基础 day21 递归函数、shutil模块
    python基础 day20 re模块、带参数的装饰器
    python基础 day19 正则表达式
  • 原文地址:https://www.cnblogs.com/hyfer/p/11056344.html
Copyright © 2020-2023  润新知