精华内容
下载资源
问答
  • 软件工程有两大核心,其一是数据结构与算法,其二就是设计模式。本篇博文分享的是设计模式,希望对所有关注设计模式的初学者有所...这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设

    软件工程有两大核心,其一是数据结构与算法,其二就是设计模式。本篇博文分享的是GOF(四人帮)提出的23种设计模式。

    一、设计模式简介

    设计模式简介

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
    设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

    什么是 GOF(四人帮,全拼 Gang of Four)?

    在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
    四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。

    • 对接口编程而不是对实现编程。
    • 优先使用对象组合而不是继承。

    设计模式的类型

    根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。

    1 创建型模式

    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

    • 单例模式(Singleton Pattern)
    • 工厂模式(Factory Pattern)
    • 抽象工厂模式(Abstract Factory Pattern)
    • 建造者模式(Builder Pattern)
    • 原型模式(Prototype Pattern)

    2 结构型模式

    这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。

    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 过滤器模式(Filter、Criteria Pattern)【备注:额外补充的一种模式】
    • 组合模式(Composite Pattern)
    • 装饰器模式(Decorator Pattern)
    • 外观模式(Facade Pattern)
    • 享元模式(Flyweight Pattern)
    • 代理模式(Proxy Pattern)

    3 行为型模式

    这些设计模式特别关注对象之间的通信。

    • 责任链模式(Chain of Responsibility Pattern)
    • 命令模式(Command Pattern)
    • 解释器模式(Interpreter Pattern)
    • 迭代器模式(Iterator Pattern)
    • 中介者模式(Mediator Pattern)
    • 备忘录模式(Memento Pattern)
    • 观察者模式(Observer Pattern)
    • 状态模式(State Pattern)
    • 空对象模式(Null Object Pattern)【备注:额外补充的一种模式】
    • 策略模式(Strategy Pattern)
    • 模板模式(Template Pattern)
    • 访问者模式(Visitor Pattern)

    这里写图片描述

    设计模式的六大原则

    • 1、开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

    • 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

    • 3、依赖倒转原则(Dependence Inversion Principle) 这个原则是开闭原则的基础,具体内容:针对对接口编程,依赖于抽象而不依赖于具体。

    • 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

    • 5、迪米特法则,又称最少知道原则(Demeter Principle) 最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

    • 6、合成复用原则(Composite Reuse Principle) 合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

    二、创建型模式

    请参考 设计模式:创建型模式

    三、结构型模式

    请参考 设计模式:结构型模式

    四、行为型模式

    请参考 设计模式:行为型模式

    参考

    本文部分内容翻译自http://www.avajava.com/tutorials/categories/design-patterns,部分内容收集自http://www.runoob.com/design-pattern/design-pattern-tutorial.html,部分内容收集自末尾参考中的资料。

    • Wiki Page for Design Patterns - 以一种非常通用的方式检查设计模式。
    • Java Programming/Design Patterns - 一篇关于设计模式的好文章。
    • The JavaTM Tutorials - 该 Java 教程是为那些想用 Java 编程语言创建应用程序的编程人员提供的实用指南。
    • JavaTM 2 SDK, Standard Edition - JavaTM 2 SDK, Standard Edition 的官网。
    • Java DesignPatterns - 关于设计模式的短文。
    展开全文
  • 【C语言程序设计】[7.4.2]最大元素时间限制: 1 Sec内存限制: 128 MB提交: 386解决: 139题目描述编一个程序,读入n个元素的实型数组,然后调用一个函数,递归地找出其中最大元素,并指出它位置。输入第一行是一个...

    【C语言程序设计】[7.4.2]最大元素

    时间限制: 1 Sec 内存限制: 128 MB

    提交: 386 解决: 139

    题目描述

    编一个程序,读入n个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它的位置。

    输入

    第一行是一个整数n(0<n<1000),代表元素的个数。

    第二行是n个以一个空格分开的实数(保证无相等元素)。

    输出

    输出最大元素(保留三位小数)及它在数组中出现的位置。

    样例输入

    3
    2.0 3.1 4.3
    ​

    样例输出

    4.300 2

    好多人问这道题,看了一些同学的写法,虽然写法不怎么一样,但是感觉错的地方都是一样的(尴尬)

    首先,这题用double会WA,要用float(不知道为什么,玄学问题)。

    第一种方法:

    用这种方法写的人最多,定义一个变量并附一个足够小的值maxx,然后循环,和数组里的每个元素比较,如果找到数组中较大的值,把这个值给maxx,然后记录下来这个值在数组中的位置,最后输出。

    需要注意的是:如果给maxx的赋值是数组的第一个元素,那么循环要从第二个元素开始,这样可以避免第一个元素是最大值的情况。循环中不要加break之类的东西,最后输出的时候不要输出循环里的i(不知道为什么,好多人这样写),这样写的后果是不论输入什么,最后输出的第二个值都等于n

    附上代码

    #include<bits/stdc++.h>
    const int maxn=1e5+10;
    float a[maxn];
    int main()
    {
    	float maxx=INT_MIN;
    	int flag;
    	int n;
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		scanf("%f",&a[i]);
    		if(maxx<a[i])
    		{
    			flag=i;
    			maxx=a[i];
    		}
    	}
    //	这种写法也可以,原理是一样的 
    //	for(int i=0;i<n;i++) scanf("%f",&a[i]);
    //	for(int i=0;i<n;i++)
    //    {
    //		if(a[i]>maxx)
    //		{ 
    //			flag=i;
    //			maxx=a[i];
    //		}
    //   }  
    	printf("%.3f %d\n",maxx,flag);
    	return 0;
    }

    第二种:递归

    直接上代码,自己理解吧,写递归经常迷

    #include<bits/stdc++.h>
    float a[10000];
    float MAX(float a[],int n)  
    {  
        float maxx;  
        if(n==1)
            return a[0];  
        else  
        {  
            maxx=MAX(a,n-1);
            return ((maxx>a[n])?maxx:a[n]);
        }  
    }  
    int main()
    {
    	int n,flag;
    	scanf("%d",&n);
    	for(int i=0;i<n;i++) scanf("%f",&a[i]);
    	float Max=MAX(a,n);
    	for(int i=0;i<n;i++)
    	{
    		if(Max==a[i]) flag=i;
    	}
    	printf("%.3f %d\n",Max,flag);
    	return 0;
    }

    第三种:定义结构体,用sort排序(这个是C++里的东西,可以不看)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    struct wzy{
    	float x;
    	int flag;
    }p[maxn];
    bool cmp(wzy u,wzy v)
    {
    	return u.x>v.x;
    }
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		scanf("%f",&p[i].x);
    		p[i].flag=i;
    	}
    	sort(p,p+n,cmp);
    	printf("%.3f %d\n",p[0].x,p[0].flag);
    	return 0;
    }

    方法不唯一,还有好多种写法,我就写了这三种,不论用什么方法只要能AC就可以了

    排序很重要,想了解更多排序方法可以百度

    转载于:https://www.cnblogs.com/Friends-A/p/9309012.html

    展开全文
  • 商务时间 5月26日论当代艺术收藏到底是“蛋糕”还是“泡沫”当代艺术收藏家、投资家,选择古玩还是当代艺术? 申明: 本人非专业游戏策划,也不是专业市场企划。只是有一颗心,用心去做事,做一件不同感受...
     marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280">
     
    商务时间 526
    论当代艺术收藏到底是“蛋糕”还是“泡沫”
    当代艺术收藏家、投资家,选择古玩还是当代艺术?
     
    申明: 本人非专业的游戏策划,也不是专业的市场企划。
    只是有一颗心,用心去做事,做一件不同感受的事情,只是我所追求的。
    审视一个事务的本质的同时,衍生到其它领域,这也许就是我理解的商机。
    本帖内容仅代表个人观点,如有雷同尽情谅解。
    以下目录结构内容,会在近期写在完成,尽情关注,谢谢。
     
    目录
    1.         游戏对象年龄结构变迁,从点卡到IB,IB我们还可以卖什么?(怪物(PK、练级、装备)追求理论)
    2.         游戏年龄结构变迁,玩家的社会价值与身份探讨,让40岁的企业家与一帮孩子做事?究竟是谁更理性?
    3.         游戏元素设计,不是抄袭仿造、死而后生,游戏设计的机遇与挑战。
    4.         避免玩家过度比较(游戏细节的成败不等于同一种事务的不同玩法),同类型题材的颠覆与创新(元神与宠物的关系,玩法是取决于同一个事务本身么)?
    5.         由本期商务时间,演变到的游戏体验,我们需要的是啤酒还是泡沫?(论换汤不换药当代游戏设计)
    6.         典型案例分析,春秋Q传挖宝设计的提升(鉴宝大赛):
    a)         玩家的物质追求与精神追求,谁能给钱让我们(设计人员、公司、企业利益)消费?
    年龄成熟化,对游戏的追求的物质享有与精神享受还决定于疯狂的个人行为么?
    史玉住让我们看到的不只是暴利行业、暴利经营。更多的是,让我们沉下心来思考
    谁才是我们真正的雇主,我们为谁而工作?游戏不是设计给有钱人消遣的,但同时也我们创造游戏,目的也不是为自己消遣。
    b)        玩家的行为模型成长度(论,究竟是游戏进化了玩家,还是玩家在进化游戏),游戏设计人员的艺术元素修养
    c)         所谓创新
                            i.              冷门市场的关注,把握市场的轮回与导向
                          ii.              前沿市场的关注,把握市场的机遇与挑战
                        iii.              两种市场,我们需要的是保守还是机遇
                         iv.              晋商问题,是票号还是商业银行,历史的一课
     


    展开全文
  • 设计一个算法,删除元素值在[x,y]之间所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1). 顺序表定义为: typedef struct { ElemType data[SizeMax]; int length; } SqList; 需编写算法为: ...

    题目描述


    若一个线性表L采用顺序存储结构,其中元素都为整数。设计一个算法,删除元素值在[x,y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1). 


    顺序表定义为:

    typedef struct

    {

        ElemType data[SizeMax];

        int length;

    } SqList;

    需编写的算法为:


    bool Delete(SqList *&L,ElemType x,ElemType y);


    输入


    输入的第一行代表线性表的长度n,n<=SizeMax。第二行输入n个元素并插入到线性表中,第三行输入两个整数x,y,确定区间。

    输出


    输出的数据占两行,第一行是删除之后线性表的长度length,接下来的一行是线性表中的每个元素。

    样例输入
    10
    5 3 6 2 1 9 8 7 4 0
    3 7

    样例输出
    5
    2 1 9 8 0

    提示

    1、请使用C++编译并提交

    2、只需提交删除区间内元素算法的部分

    3、注意区间端点值是否合理(若不合理,返回false)


    C++:

    #include <stdio.h>
    #include <stdlib.h>
    #define SizeMax 10000
    typedef int ElemType;
    typedef struct
    {
        ElemType data[SizeMax];
        int length;
    } SqList;
    void CreateList(SqList *&L,ElemType n)
    {
        if(n>SizeMax)return;
        L=(SqList*)malloc(sizeof(SqList));
        for(int i=0; i<n; i++)
            scanf("%d",&L->data[i]);
        L->length=n;
    }
    bool Delete(SqList *&L,ElemType x,ElemType y)
    {
        if(x>y)return false;
        int n=L->length;
        for(int i=0,j=0; i<n; i++)
        {
            if(L->data[i]>=x&&L->data[i]<=y)L->length--;
            else L->data[j++]=L->data[i];
        }
        return true;
    }
    void Print(SqList *L)
    {
        int i;
        printf("%d\n",L->length);
        for(i=0; i<L->length; i++)
            printf(i!=L->length-1?"%d ":"%d\n",L->data[i]);
    }
    void DestroyList(SqList *&L)
    {
        free(L);
    }
    int main()
    {
        SqList *L;
        ElemType n,x,y;
        scanf("%d",&n);
        CreateList(L,n);
        scanf("%d%d",&x,&y);
        if(Delete(L,x,y))
            Print(L);
        DestroyList(L);
        return 0;
    }
     

    展开全文
  • 而木质元素作为自然气息的代表之一,穿梭在所有装修风格设计中,任意挑选一种装修风格,你都能在其中发现木质元素的影子。那么今天就来聊聊蕴含木质元素最多四种装修风格,你最为中意哪一种呢?一、北欧风格vs...
  • 数据库范式设计

    2020-07-03 16:02:18
    范式设计:数据表的范式有哪些,3NF指的是什么?...所以在开始设置数据库的时候,我们就需要重视数据表的设计 范式设计 准备知识 函数依赖 解释:∀ -->代表任意的 。 依赖:R(U)是 自变量集U上的关系集合
  • =len),设计一个时间复杂度为O(N)、空间复杂度为O(1)算法,改变原来顺序表,把顺序表中原来在前m个元素放到表后段,后len-m个元素放到表前段。 注意:先将顺序表元素调整为符合要求内容后,再做输出,...
  • 设计模式简介

    2019-10-04 08:51:38
    设计模式代表了最佳实践,是开发人员在开发过程中面临的一般问题的解决方案。...1994年,由Gang of Four在《设计模式-可复用的面向对象软件元素》中首次提到了软件开发中的设计模式的概念。他们所提出的设计模式...
  • 其中argc代表参数个数,argv是一个字符串数组。参数个数包括程序名自身,argv数组 第一个元素是argv[0]。命令行参数在向程序传递信息方面很有用。可以使用短横线(-)开头命令行参数来设置标志或者开关。 有...
  • ICON图标设计

    2020-08-29 23:53:24
    ICON不仅是图标这么简单,它承载了文字含义,将文字图形化,而让人使用最少的时间来理解这个按钮含义,ICON是审美与功能完美融合的元素。 一、ICON设计原则 1,意义明确 这个很容易理解,当你要做一套icon时,它...
  • 很多人会认为中文海报难以显现格调和档次,视觉效果与外文海报相差甚远,但实际上汉字凝聚着中华传统智慧与思维,极具代表性和表现力,以汉字为主体进行海报设计,更具指示性强、简洁清晰传播效果,能在短时间内...
  • 给定一个整数数组,其中第i个元素代表了第i天股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多交易(多次买卖一支股票): 你不能同时参与多笔交易(你必须在再次购买...
  • 26、 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长的单调递增子序列。 27、 旅游预算问题。一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游...
  • 假设我们有一个数组,第i个元素代表第i天给定股票价格。我们必须设计一种算法来找到最大利润。我们最多可以完成两笔交易。因此,如果给定价格为[3,3,5,0,1,3,1,4],则结果将为6,因为我们将在第4天买入(价格0),...
  • 算法(Algorithm)是指解题方案准确而完整描述,是一系列解决问题清晰指令,算法代表着用系统方法描述解决问题策略机制。也就是说,能够对一定规范输入,在有限时间内获得所要求输出。如果一个算法有...
  • 4 最简单 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出概念及在 C 语言中实现 54 4.4 字符数据输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...
  • 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露其内部表示 适配器模式uml图 角色介绍: Clinet:代表客户代码 Aggregate:一个共同接口供所有聚合使用,将客户代码与具体集合对象实现解耦...
  • 以中国汉字为灵感来源,以篆刻艺术为主要呈现形式,将冬季运动元素与中国传统文化巧妙结合,彰显了北京冬奥会和冬残奥会理念和愿景。图标以霞光红为底色,寓意着日出东方,代表着热情和希望。据图标设计团队主创设...
  • 排队人员列表,每个列表元素代表一个排队人员,元素的代表所需结账时间 超市结账机器数n,一个正整数 说明: 只有一个队列,且队列顺序不会改变 假定队列每个人结账完就立刻让出结账机器 答案: def queue_...
  • 设计模式之享元模式

    2018-02-25 23:28:19
    2018年第一篇博客居然是开年后第一个周末,换了公司之后,事情比较多,也比较忙,直到现在才有点时间可以写点自己要写东西。2018年对自己好好加油,努力学好技术[加油]。 享元模式 享元英文是flyweight,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 150
精华内容 60
关键字:

代表时间的设计元素