设计模式学习笔记-面向对象基本概念和四大特性

面向对象编程和面向对象编程语言

面向对象编程(Object Oriented Programming) OOP
面向对象编程语言(Object Oriented Programming Language)OOPL

  • 基础概念 : 类(class)、对象(object)
  • 面向对象编程是一种编程范式,以类和对象作为组织代码的基本单元,并将封装、抽象、集继承、多态作为代码设计实现的基石
  • 面向对象编程语言是支持类和对象语法机制,能方便使用四大特性的编程语言(并没有官方定义)

面向对象编程和面向编程语言之间的联系

面向对象编程一般是使用面向对象编程语言实现,但是不使用面向对象编程语言照样可以实现面向对象编程。即使是面向对象编程语言写的代码可能也是 面向过程风格的代码

面向对象分析和面向对象设计

  • 做什么---面向对象分析

  • 怎么做---面向对象设计

面向对象四大特性

  • 封装

    Java 通过 访问权限(public ,private等)来实现封装,如果对类中的属性不做限制,那任何代码都可以访问、修改类中的属性,这对于开发者来说是不可控的,你的代码可能在项目中被不同的代码调用,属性可以被随意修改意味着任何调用者的代码都可以修改,这会影响代码的可读性和可维护性,可以类比于我们的笔记本电脑,厂家通过一个壳子只给我们留下了键盘、鼠标、显示屏等外设,这极大的降低了我们使用电脑的难易度,如果厂家(开发者)将电脑的全部细节都暴露给我们(调用者),一会增加我们的使用难度,二会降低电脑的质量(随时都会因为我们的修改让电脑毁坏,毕竟不是每个人都很熟悉电脑的专业知识,类似不是每个员工都对项目的业务很熟悉,封装可以有效避免新员工(业务不熟)胡乱修改)

  • 继承

    继承表示 is-a关系,比如 “猫 --是--哺乳动物”,“麻雀--是--会飞的”,最大的好处是代码复用,将两个类共同的部分抽取到父类中,即抽取共性类,过度使用继承会导致继承层次复杂,代码的可读性可维护性变差,子类与父类高度耦合,修改父类代码会直接影响到子类,所以有多用组合少用继承的设计思想

  • 多态

    多态是指在程序运行过程中,子类可以替换父类,多态实现的几种方式包括

    1. 编程语言提供特殊的语法机制,比如Java中父类对象可以引用子类对象,比如继承,比如子类可以重写父类方法
    2. 通过接口类语法实现
    3. 利用duck-typing语法

    接口类语法:

    public interface Iterator{
        String hasNext();
        String next();
        String remove();
    }
    
    public class Array implements Iterator{
        private String[] data;
    
        public String hasNext(){...}
        public String next(){...}
        public String remove(){...}
    }
    
    public class LinkedList implements Iterator{
        private LinkedListNode head;
    
        public String hasNext(){...}
        public String next(){...}
        public String remove(){...}
    }
    
    public class Demo{
        private static void print(Iterator iterator){
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    
    
        public static void main(String...args){
            Iterator arrayIterator=new Array();
            Iterator linkedListIterator=new LinkedList();
            print(arrayIterator);
            print(linkedListIterator)
        }
    }

    duck-typing语法:

    Logger 和 DB 两个类没有任何关系,只要他们都定义了record方法就可以传到test方法中执行对应的record方法(这是一些动态语言特有的语法机制)

    class Logger:
        def record(self):
            print("i write a log")
    class DB:
        def record(self):
            print("i insert a record")
    def test(recorder):
        recorder.record()
    def demo():
        logger=Logger()
        db=DB()
        test(logger)
        test(db)

    多态特性能提高代码的可扩展性和复用性,一个test方法可以应用到Logger 和 DB 两个类上,一个print方法,可以打印Array 和 LinkedList 集合的数据,同时多态也是很多设计模式的实现基础

  • 抽象

    封装主要指的是如何隐藏信息,保护数据(类的属性),而抽象讲的是如何隐藏方法的具体实现,让调用者只关心方法提供了哪些功能,而并不需要知道是怎么实现的。抽象是一个宽泛的设计思想,是人类处理问题时候的一种手段,是一种从上而下的解决问题的思路,抛弃细节,站在森林之外去选择要哪棵树,也叫大局观或者宏观。课程中有一个例子,获取图片的方法,getAliyunPictureUrl() 就不是一个具有抽象思维的命名,因为如果图片不存在阿里云服务器上了,命名也要随之修改

附上大牛课程

http://gk.link/a/10fWa

猜你喜欢

转载自www.cnblogs.com/roadzhao/p/12291211.html
今日推荐