MATLAB面向对象_及_设计模式

MATLAB面向对象


20200322

面向对象编程的优点

  • 把大问题分解成小对象
  • 通过组合和信息传递完成任务
  • 通过继承达到代码的复用
  • 修改或者添加模块不会影响到其他模块

1、为了解决一个大问题,需要将大问题分解成多个小问题。对于面向过程而言,其对应的小问题是函数,数据在函数间交互
对于面向对象而言,其对应的小问题是模块,模块不但拥有数据还拥有方法,模块和模块之间通过组合和交互来解决问题
2、面向对象通过各个对象之间的组合和信息的传递完成任务,对象之间不仅可以相互交流,而且可以组合成新的对象
3、面向对象的编程方式对修改封闭,对扩展开放

MATLAB中的类

MATLAB中的任何变量都属于一个类,
在这里插入图片描述
MATLAB中在新建类的时候,提供了最基本的模板,
在这里插入图片描述

classdef Point2D < handle
    %----------------------------------------------------------------------
    % 类的属性
    %----------------------------------------------------------------------
    properties
        x
        y
    end
    
    properties(Dependent)            % 非独立属性,其值依赖于其他属性的值
        r
    end
    
    properties(Constant,Hidden)      % 同时设置属性为 常量属性、隐藏属性
        verInfo = '1.00版本,测试使用';
    end
    
    %----------------------------------------------------------------------
    % 类的方法
    %----------------------------------------------------------------------
    methods
        %-- 构造函数
        function obj = Point2D(x0,y0)
            if nargin == 0 
                obj.x = 10;
                obj.y = 20;
            elseif nargin == 2
                obj.x = x0;
                obj.y = y0;
            end
        end
        
        %-- 计算 非独立属性 的值
        function r = get.r(obj) 
            r = sqrt(obj.x^2+obj.y^2);
            disp('get.r被调用\n');
        end
        
        %-- set方法,设置属性的值
        function set.x(obj,val)
           obj.x = val;
           disp('set.x被调用\n'); 
        end
        
%         %-- 对坐标点进行归一化
%         function normalize(obj)
%             obj.x = obj.x/obj.r;
%             obj.y = obj.y/obj.r;
%         end
        
        %-- 输出属性
        function print(obj)
            disp(['x=',num2str(obj.x)]);
            disp(['y=',num2str(obj.y)]);
        end
    end
end

classdef Point3D < Point2D % 用<表示继承
    properties
        z
    end
    
    methods
        function obj = Point3D(x0,y0,z0)
            obj = obj@Point2D(x0,y0);
            obj.z = z0;
        end
        
        function print(obj)
            print@Point2D(obj);
            disp(['z=',num2str(obj.z)]);
        end
    end
end

类的属性

  • 属性对类型没有限制,可以是标量,可以是矩阵,可以是GUI对象,等等
  • 属性可以有默认值,默认值可以直接赋予一个值,也可以是一个MATLAB表达式仅在加载类的时候计算一次
  • 常量属性在对象生存周期中保持不变,不能对其进行修改(通常用来修饰工程计算中规定的常量、硬件指标
  • 非独立属性的值依赖于其他属性,一旦其他属性的值改变,则该属性也会改变;支持点调用和向量化操作
  • 隐藏属性是指在命令行中查看对象的信息时,该属性不会显示出来

类的方法

  • 可以在类定义中仅给出函数的声明,将函数的实现放到一个单独的文件中(构造函数、析构函数、static函数不能如此做
  • 如果想使用点调用的方式,则obj必须作为成员方法的参数之一
  • 方法的签名是由调用对象所属的类的名字和方法的名称共同构成的。
  • 构造函数与类名相同,它负责创建类的对象,通常也用作初始化对象的属性。一个类的定义中只能有一个构造函数。

类的继承

  • 使用<表示继承
  • 可以通过isa函数来查询一个对象是否属于一个特点的类
  • 子类先继承了父类的属性和方法,然后才在父类的基础上增加了自己的属性和方法
  • 在子类方法中调用父类方法时,@符号前面是父类方法的名称,后面是父类的类名

类的聚集

参考博文链接
类的组合
类的聚集

从以上文章可知,可以从如下几点来考虑聚集和继承的异同,
相同点
都允许在自己的类中加入其它类的对象去访问相应的对象、操作相关的方法。
不同点

  • 理解is-a和has-a。is-a表示“是一个”的意思,可以理解成为一种“属于”关系(可以通过继承来实现)has-a表示“有一个”的意思,可以把它理解为一个“包含”关系(可以通过聚集来实现)
  • 继承当中子类和父类之间的耦合性是比较高的。相对于继承来说,聚集中没有继承中那种层与层之间的严格层次结构,与继承相比使用更灵活一些

Handle类的set和get方法

  • set方法为对象属性的赋值提供了一个中间层。通常用来检测赋值是否符合要求;或者在设置属性值得时候,附带做一些其他的工作
  • get方法为查询成员属性提供了一个中间层。最常用的是,当某个属性设为Dependent时,使用get方法;或者在处理大程序时,为了维持多个版本之间的兼容性,使用get方法
  • 使用set和get方法是有时间成本的。在MATLAB中,调用成员方法的时间要大于直接访问属性的时间,并且set和get方法不会被MATLAB即时编译加速

类的访问权限

Access赋值SetAccess查询GetAccess

私有属性,只有该类的成员方法可以访问该数据,而子类和其他外部函数无法访问;
保护属性,只有该类的成员方法和子类可以访问该数据;
公开属性该类的成员方法、子类的成员方法、类之外的函数都可以访问该数据

另外,MATLAB还提供了机制来实现仅仅把私有数据的访问和修改权限提供给个别类的功能。

MATLAB的Vaule类和Handle类

参见博文链接
MATLAB句柄类和实体类
MATLAB 面向对象编程(五)Value类和Handle类
Handle类和Value类的区别

函数的参数传递
普通函数的参数传递都是值传递,即函数内对参数的任何修改都不会影响函数外原有的值;无法通过函数引用传参对传入数据进行处理,如果非要得到处理后的参数,必须将其设置为返回值;如果大量数据进行这种处理,就会导致运算速度很慢。

Vaule类和Handle类

  • Value 类是数值类,数值类不能在非构造函数中修改类的属性,如果要修改属性必须返回一个新的类,原来类依旧不变
  • Handle 类在定义类时继承 handle 即可,Handle 类可以在非构造函数中修改属性

  • Value 类复制(nValue = mValue)会复制新的数据给 nValue ,两个类拥有两份独立数据
  • Handle 类复制(nHandle = mHandle)只是复制指针,相当于引用,即 nHandle 和 mHandle 指向相同的数据,相当于引用

  • Value类比较简单,Value类对象的行为和普通的MATLAB变量,还有普通的struct行为基本一致,当我们希望定义数据结构的时候,可以使用Value类。如果我们希望每次对对象的拷贝,得到的都是一个独立的对象,可以使用Value类
  • Handle类对象提供的是对实际数据的一个访问渠道,从实用计算的角度来说,如果我们的数据体积比较大,我们希望这些数据在各个方法,函数之间的传递迅捷,不需要被局部拷贝的话,可以用Handle类来包装数据
  • 从物理的角度,如果类的对象对应的是一个独一无二的物理对象,比如一个串口,比如一个打印机,比如对一个文件的访问接口,那么应该把它设计成Handle类,因为对这些对象的拷贝仅仅拷贝的是一个访问它们的渠道。如果把它们设计成Value类,当我们做拷贝时,将面临这样一个难题,很难从语义上解释一个独一无二的实体在程序中有两个全同的拷贝。

设计模式

博文链接

Matlab函数装饰器(Functional Decorator)
Matlab组合模式(Composite)
Matlab代理模式(Proxy)
Matlab中介者模式(Mediator)
Matlab享元模式(Flyweight)
Matlab命令模式(Command)
Matlab桥接模式(Bridge)
Matlab混入模式(Mixin)
Matlab空对象模式(Null Object)
Matlab解释器模式(Interperter)
Matlab备忘录模式(Memento)
Matlab建造者模式(Builder)
Matlab迭代器模式(Iterator)
Matlab适配器模式(Adapter)
Matlab状态模式(State)
Matlab工厂模式(Factory)
Matlab单例模式(Singleton)
Matlab模板模式(Template)
Matlab装饰模式(Decorator Pattern)
Matlab责任链模式(Chain)
Matlab外观模式(Facade)
Matlab原型模式(Prototype)
Matlab观察者模式(Observer)
Matlab策略模式(Strategy)
Matlab访问者模式(Visitor)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值