`
Be_Q
  • 浏览: 3659 次
  • 来自: 苏州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
文章列表
对于一群类型相同的对象集合,其存储方式可以是多种多样的数据结构,如数组、列表等,他们对集合具体操作不同,但是可以通过iterator接口来统一他们的操作。 对于用不同数据结构的集合A和B,若要统一遍历他们的各个项,先让他们分别实现Iterator接口,实现各自的next()和hasnext()函数,然后在他们的类中定义一个返回迭代器的函数CreateIterator(){return new DinerMenu(menuitems);},这样在统一带调用的时候,不需要弄清A和B的细节,只用获得他们各自的迭代器就行了。     使用java中内置的Iterator接口时,对于Array ...
如果希望父类中的方法不能被子类所覆盖,用final关键字     对于若干个方法,取出相同的子方法,将不同的子方法进行泛化,封装在新的模板类(是个抽象类)中,不同的子方法规定为abstarct的,在子类中去实现它。 还可以在模板类中加入一个hook(钩子),这个方法可以作为条件控制,影响抽象类的算法流程,如决定是否要执行加入调料的步骤,可以征求客户的请求。即当步骤方法是可选的时候,用钩子。在java中,JFrame中的paint()方法就是一个钩子,再比如,Applet中的很多方法都是钩子。钩子是一个方法,他在抽象内中不做事情或者说只做默认的事情,子类可以选择要不要覆盖他。   ...
适配器模式是将一个接口转化为另一个接口,以达到客户的要求。具体方法是适配器实现(implement)目标接口,在适配器中组合adaptee(被适配者),将适配器中的其他动作委托给adaptee。优点是adaptee的任何子类都可以搭配适配器使用---------对象适配器 类适配器使用的是多重继承的方式,即适配器继承target和adaptee(这个在java中无法实现),是将对target方法的调用转接到adaptee方法上。 外观模式目的是为了简化接口,定义一个外观类,使用组合的方式来访问子系统中的一群接口,更容易使用。然后根据需要简化接口,注意不是封装,系统完整的功能依然暴露在外面, ...
一个类只有一个实例,并且该类的构造函数私有,但是该类提供一个可以获得实例的一个静态方法,另外还需要一个静态变量。 组合也叫引用
例子,pizza的生产模式 1.平行的类层级,如Pizza类和PizzaStorte这两个抽象类,他们的子类都有特定的实现。所谓实现一个借口,指的是实现超类型的(类或接口)中的一个方法。在PizzaStore中有create和order两个方法,这两个方法将由子类决定的可变部分(create部分,在父类pizzastore中是抽象的,在派生类中实现,如在NYpizzastore中实现)和公共部分的不变部分相分离(即每个pizza的烘烤,切片等手续),create中的对象的创建推迟到子类中去,至于交给PizzaStore的哪一个子类,由顾客决定。 2.工厂模式就是让子类决定该创建的对象是什么,选择 ...
1.强大的类能够对扩展开发,对修改关闭,即所谓的开发--关闭原则,这样的设计更有弹性,可以应对改变,接受新的功能。 2.组合,委托,实例化行为类。,和继承相比的优点是,子类的职责可以不在修改原来代码的前提之下、不局限于父类的方法和限制,增加多个新职责。 2.一个经典的例子,我们以饮料为主体,然后在运行时以调料来装饰饮料。其中,组合和继承的区别和作用:继承是为了让类型相同,让装饰者和被装饰者有相同的类型,继承自同一父类,这很关键;而组合是为了获得新的行为,只要通过实现新的装饰者就能增加新的行为,但是如果依赖继承,则必须修改父类的代码。在这里组合主要体现在具体装饰者的Beverage成员对象,Bev ...
1.主题和观察者之间,主题只会发送通知给所以实现了观察者接口的对象,是一对多的联系。当一个对象改变状态时,它的所有依赖者都会受到通知并且自动更新。观察者接口提供了一个由主题(java内置中叫做可观察者observable,同样的意思)调用的方法update(). 2.观察者模式实现原理;可观察者和诸多观察者内有可变数据(其中观察者只有自己想要了解的数据),可观察者和诸多观察者存在一对多的关系,每一对可观察者和观察者相互私有包含一个对象,具体表现在观察者主动性(构造函数)中,其中观察者自己将自己和某个特定的可观察者绑定,即注册。运行开始,当可观察者数据变化时,改变其可变数据同时调用与其绑定的所以观 ...
策略模式,即行为类的使用,用一个类去诠释一个行为。这样当实体类需要行为时,通过它的行为类实例(行为类实例是它的数据成员)来进行委托。这种实体类和行为类的结合使用叫做组合。多用组合,少用继承,这是个很重要的技巧,这样系统会有很大的弹性。 针对接口编程,不要针对实现去编程。 模式设计的学习,它是对问题的通用解决办法。 对于具体的类,只在它的构造函数之中去实例化它的行为类对象,从而去区分它的特点。
1.迭代器,用于遍历容器(比如vector和数组等)和string,有begin()和指向最后一个元素的后一个位置的end(); 2.数组指定大小,vector大小可变,但是不允许在范围for循环内改变vector的容量大小,因为这样会使迭代器失效,失效是违法的。 3.指针是数组的迭代器,和数组关系精密。若有数组a[10]表现在:   (1)告诉我们数组名a,编译器会将其转化为指针,将其替换为一个指向数组首元素的指针p,从而通过对指针的操作访问数组,即指针p=a或者p=&a[0];    (2)数组是个迭代器,begin=p;end=&a[10],这就是a[10]存在的唯一意义。 ...
1.变量的声明和定义。声明是让名字为程序所知,规定了类型和名字,而定义则还申请了空间。变量只能被定义一次,但可声明多次。只想声明不想定义用extern. 2.作用域问题。对于for循环而言,定义在for语句内的i只能在该语句内被调用,最好用{},之外可能有误,其他地方无法访问。对于变量的定义,习惯在用到的时候定义它。   对于全局变量,或者其他地方的变量可以用:: 3.对象指的是能够存储数据的具有某种类型的内存空间。只有对象才有引用,引用是别名,即内存空间的别名。 4.const定义常量,不可改变,但若想文件之间共享,则用extern,这样只需要定义一次即可。 5.cin不能读入空格,若想读入空 ...
1.关于运算符重载,是在类的基础上新的定义和实现,是为了实现多态性,主要通过成员函数和友元函数来实现。对于单目运算符用成员函数,对于对象和数之间的预算,采用友元函数。 2.数据结构是把一组相关数据元素组合在一起的策略和方法,多态性则是指相同的名字的函数,具有不同的功能。 3.strcpy()函数用于字符数组,不能用于string对象,因为对象之间可以直接=。 4.c++中新定义的整数数组必须初始化,习惯问题。只有最新的C++版本才能隐含初始化。 5.重载和覆盖,重载是函数名相同,但是参数列表不一致。编译时能唯一识别。覆盖是派生类对基类方法的覆盖。 6.typedef int elemtype,* ...
Global site tag (gtag.js) - Google Analytics