童话说说技术创业美文职业
投稿投诉
职业母婴
职场个人
历史治疗
笔记技能
美文纠纷
幽默家庭
范文作文
乐趣解密
创业案例
社会工作
新闻家居
心理安全
技术八卦
仲裁思考
生活时事
运势奇闻
说说企业
魅力社交
安好健康
传统笑话
童话初中
男女饮食
周易阅读
爱好两性

设计模式入门指南

6月14日 飞仙轩投稿
  想知道设计模式是什么?在这篇文章中,我会解释为什么设计模式重要。我也会提供一些PHP的例子来解释什么时候什么情况下来使用设计模式。
  什么是设计模式?
  设计模式是针对我们日常编程问题的经过优化的可重用的方法。一种设计模式不仅仅是可以简单集成到系统中的一个类或者一个库。它是一个只能在正确的情境下使用的模板。它也不是只针对某种语言。一个好的设计模式应该可以适用于绝大多数语言中,同时也要依赖于语言的特性。最重要的是,任何设计模式如果用错地方的话,就有可能变成一把双刃剑,它可以是灾难性的而且为你造成许多问题。当然,用在合适的地方,它就是你的救世主。
  有三种基本的设计模式
  结构型
  创造型
  行为型
  结构型设计模式通常处理实体之间的关系,使这些实体之间更容易协同工作。
  创造性设计模式提供了实例化机制,在合适的情境下创建对象变得更容易。
  行为型设计模式用于实体之间的通讯,使得这些实体之间互相交流更容易和灵活。
  我们为什么要使用设计模式?
  设计模式是针对程序问题按照原则仔细思考之后的解决方法。许多程序员都碰到过这些问题,并且针对这些问题对症下药。如果你遇到这些问题,为什么不使用已经被证明过的方法而要自己重新创建一个呢?
  示例
  让我们设想一下,你得到了一个任务,根据情况将两个不同行为的类合并到一起。这两个类大量应用于现有系统中的不同地方,这将使得移除这两个类而且改变现有的代码非常困难。为了作出这些改变,改变现有代码同样要测试改变后的代码,因为系统中可能在不同的组件中依赖这些改变,这将引入新的bug。取而代之,你可以实现一个基于策略模式和适配器模式的变种,就可以很容易的处理这种类型的情况。
  classStrategyAndAdapterExampleC{
  
  
  
  publicfunctionconstruct(context){
  
  }
  publicfunctionoperation1(){
  if(“contextforclassone”){
  operation1inclassonecontext();
  }else(“contextforclasstwo”){
  operation1inclasstwocontext();
  }
  }
  }
  很简单吧。现在,我们可以仔细了解一下策略模式。
  策略模式
  在上面的例子中,采用的策略是根据类初始化时context变量的值决定。如果context值为classone,将使用classone,否则使用classtwo。
  聪明吧,但是我能在什么地方使用呢?
  设想你现在正在设计一个可以更新或者创建新的用户记录的类。它仍然需要同样的输入(name,address,mobilenumber等等),但是,根据给定的情况,当更新或者创建时不得不采用不同的方法。现在,你可能只使用一个ifelse来完成这个。但是,要是你在一个不同的地方需要这个类咋办?在这种情况下,你将不得不一遍又一遍地重写同样的ifelse语句。在这种上下文环境中使用策略模式不是更轻松么?
  classU{
  publicfunctionCreateOrUpdate(name,address,mobile,null)
  {
  if(isnull(userid)){
  doesn’yet,record
  }else{
  exists,userid
  }
  }
  }
  现在,通常的策略模式包括封装你的算法在另外一个类中,但是在这种情况下,创建另外一个类可能会比较浪费。记住你并不是必须采用这种模板。在类似的情况中采用这种变化,就可以解决问题。
  适配器模式
  这同样可以让你改变一些从客户端类接收到的输入,使其和被适配者的功能吻合。
  我能怎样使用它?
  表述一个适配器类的另外一个术语是封装,表示允许你把行为封装到一个类中,并且在正确的情形下重用这些行为。一个经典的例子,当你为表创建一个领域类,你可以使用一个适配器类封装所有的方法到一个方法中,而不是调用不同的表并且一个一个的使用它们的方法。这不仅允许你重用你想使用的任何行为,如果你需要在不同的地方使用相同的行为的话,同样使你不必重写代码。
  比较着两个实现,
  非适配器方法
  usernewUser();
  CreateOrUpdate();
  profilenewProfile();
  CreateOrUpdate();
  如果我们需要在不同的地方这么做,或者甚至在不同的项目中重用这些代码,我们将不得不重新写下这些东西。
  更好的
  相反我们可以这样做:
  accountdomainnewAccount();
  NewAccount();
  在这种情况下,我们有一个封装类作为我们的账号(Account)类:
  classAccount()
  {
  publicfunctionNewAccount()
  {
  usernewUser();
  CreateOrUpdate();
  profilenewProfile();
  CreateOrUpdate();
  }
  }
  这样,每当你需要账户类的时候你就能使用它。此外,你也可以在领域类中封装其他类。
  工厂方法模式
  这个模式的主要目标是把不同类的创建过程封装到一个单独的方法中。通过为工厂方法提供正确的上下文环境,它能够返回正确的对象。
  何时能使用它?
  使用工厂方法模式的最佳时机是当你有各种各样的不同的独立实体的时候。比如说你有个按钮类,这个类有很多不同的变种,如图片按钮,输入按钮和Flash按钮。根据需要,你可能要创建不同的按钮这就是你能使用工厂为你创建按钮的地方。
  abstractclassB{
  
  publicfunctiongetHtml()
  {
  
  }
  }
  classImageButtonextendsB{
  protectedhtml“”;THTMLbutton
  }
  classInputButtonextendsB{
  protectedhtml“”;THTML();
  }
  classFlashButtonextendsB{
  protectedhtml“”;THTMLbutton
  }
  现在,我们能创建我们的工厂类:
  classButtonFactory
  {
  publicstaticfunctioncreateButton(type)
  {
  baseClass‘Button’;
  targetCucfirst(type)。baseC
  if(classexists(targetClass)issubclassof(targetClass,baseClass)){
  returnnewtargetC
  }else{
  thrownewException(“T’type’recognized。”);
  }
  }
  }
  我们能像这样使用这段代码:
  buttonsarray(‘image’,‘input’,‘flash’);
  foreach(buttonsasb){
  echoButtonFactory::createButton(b)getHtml()
  }
  输出的应该是所有的HTML按钮类型。这样,你将能够根据情况说明该创建哪个按钮并且重用这些条件。
  装饰者模式
  装饰者模式的目标就是扩展的功能可以被适用在一个特定的实例,而且同时可以能够创建一个不具备这个扩展功能的原始实例。装饰者模式同时允许为一个实例使用多个装饰者类,这样你就不必纠缠于为每个实例创建一个装饰者类。这个模式在继承时是可选择的,继承指的是你可以从一个父类中继承父类的功能。不同于继承在编译时添加行为,在情况允许下,装饰允许你在运行时添加一个新的行为。
  我们可以根据以下几步实现装饰者模式:
  1。创建一个装饰者类继承原始组件。
  2。在装饰者类中,添加一个组件域。
  3。在装饰者类的构造函数中初始化这个组件。
  4。在装饰者类中,重新将所有的调用新组件的方法。
  5。在装饰者类中,重写所有需要改变行为的组件方法。
  我该何时使用?
  当你拥有一个实体,这个实体仅在环境需要的时候拥有新的行为,这就是使用装饰者模式的地方。比如你有一个HTML连接元素,一个退出连接,你想根据当前的页面做一些稍微不同的事情。为了达到那个目标,我们可以使用装饰者模式。
  首先,我们根据需要建立不同封装者。
  1。如果在首页并且已经登入了,我们希望这个连接被
  标签封装起来。
  2。如果我们在一个不同的页面并且已经登入,我们希望这个连接被underline标签封装起来。
  3。如果我们登入了,我们希望这个连接字体被加粗。
  一旦我们建立好我们的封装类,我们可以开始编写了。
  HtmlL{
  links
  }
  LogoutLHtmlL{
  
  construct(){
  ”Logout”;
  }
  setHtml(html)
  {
  
  }
  render()
  {
  
  }
  }
  LogoutLinkH2DHtmlL{
  
  construct()
  {
  
  setHtml(“
  “。。”
  “);
  }
  call(name,)
  {
  name(args〔0〕);
  }
  }
  LogoutLinkUnderlineDHtmlL{
  
  construct()
  {
  
  setHtml(““。。”“);
  }
  call(name,)
  {
  name(args〔0〕);
  }
  }
  LogoutLinkStrongDHtmlL{
  
  construct()
  {
  
  setHtml(“”。。””);
  }
  call(name,)
  {
  name(args〔0〕);
  }
  }
  我们可以这么使用它们:
  LogoutLink();
  if(){
  LogoutLinkStrongDecorator(logoutlink);
  }
  if(){
  LogoutLinkH2Decorator(logoutlink);
  }{
  LogoutLinkUnderlineDecorator(logoutlink);
  }
  render();
  这里我们能够看到我们是如何在需要的时候结合多个装饰者类的。既然所有的装饰者类使用call方法,我们仍人可以调用原始的方法。如果我们假设我们现在在首页并且已经登入了,HTML输出应该是:
  Lh2
  单件模式
  因为单件变量对于所有的调用都是一样的,这使得其他对象使用单件实例更简单。
  我该何时使用?
  如果你需要把一个特定的实例从一个类传递到另外一个类,你能够使用单件模式来避免不得不通过构造函数或者参数传递这个实例。设想你已经创建了一个会话(Session)类,模仿了SESSION全局数组。既然这个类仅需要被实例化一次,我们可以这样实现一个单件模式:
  php
  Session
  {
  
  getInstance()
  {
  if(isnull(self::instance)){
  self::self();
  }
  self::
  }
  construct(){}
  clone(){}
  use
  }
  instance
  Session::getInstance();
投诉 评论 转载

数据仓库的基本架构数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(DecisionSupport)。其实数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数……设计模式入门指南想知道设计模式是什么?在这篇文章中,我会解释为什么设计模式重要。我也会提供一些PHP的例子来解释什么时候什么情况下来使用设计模式。什么是设计模式?设计模式是针对我们……新版Flickr照片展示页新在哪里(译)变得更大!照片:照片是这个页面中最重要的元素,所以我们把默认展示尺寸由500像素提升至640像素(最长边)。页面宽度:为了更好展示新的照片尺寸,对于照片展示页面宽度……7条大型网站设计和维护的关键技巧文中最后一段代码Demo在译言的编辑器中转换有问题,可以移步至原文或者我博文项目范围和规模各不相同,他们带来的挑战各不相同一样。作为一个独立的网页设计师,我最大的职责就是……需求是如何变成产品原型的在一个互联网公司的工作流程中,产品经理(主要指偏向产品设计的产品人员)和交互设计师是这个流水线上最起点的环节,也是关系最暧昧的两个环节。说其暧昧,是因为在很多互联网公司里面,这……构建成功web应用的十项黄金法则构建成功web应用的十项黄金法则此文译自FredWilson2010年2月在迈阿密举行的Web未来应用的年会上的演讲谢谢青云推荐了这篇这么好的演说……弹出窗口与切换页面的对比总结分享较早前的一个小总结,关于在选择弹出窗口还是选择切换页面来承载信息时,可用用来判断的几个角度,合适初学者来读。1。弹出窗口与切换页面的区别1)操作的连贯……通过HTML5来改进微博手机版本的体验HTML5引入并加强了一系列功能,包括表单控制,应用程序接口(APIs),多媒体,结构化和语义化。都说html5javascript是flash或者silverlight这类客……有感于“山寨”二字与产品设计最近很多朋友都进了淘宝,跟朋友聊起来,话题大都是,淘宝怎么会这么不争气,基本就搞不出来什么像样的产品出来,甚至经常会被淘宝的新产品雷到。尤其是支付宝的体验,那更是经常性的让人心……产品开发的过程产品从无到有,从一个想法到雏形到上线的产品,都有个过程。不论是产品、运营、开发、测试等都有自己的职责和工作。很多公司都希望将自己的产品流程化,正规化,希望按照一定的流程走下去,……如何量化用户体验很多人都把用户体验看作是网站成功与否的一个总体衡量标准。分析一个网站在提供好的用户体验方面的效果如何,往往会变成一项很主观的事情,仅停留在观点层面,缺乏客观依据。本文描述……Web表单设计之注册表单必须面对的问题有:用户不喜欢提交表单。然我们的目的是让用户愿意提交表单。下面是一个关于web表单设计的调查报告,这个结果来源于100个令人瞩目的网站。注册表单设计调……
优惠券广告设计案例分享5个超棒APP首页设计:伟大的设计是怎样提升用户忠诚度的?美港股证券产品从0到1设计:从画像到架构拍一张照片,就能设计成一幅海报设计沉思录字体设计一点谈产品的下一站:美好而有意义的生活瞬间设计案例分享之指纹识别如何通过优化Appstore应用截图,提高App的下载率?界面中的情感化设计动态设计的起源、延续与趋势“爆品”方法论总结520运营实例复盘:用心手绘的奇妙关系2021中国小将让伊藤与张本沦陷草原我来了听话,饭后再喝咖啡【歌词】未来就是现在周笔畅歌手:2005超级女生手机铃声热议 女性过度节食可致胸部下垂腿粗穿什么裤子显瘦七款搭配解你忧愁什么都不完美作文西游记真假美猴王之谜,六耳猕猴是孙悟空的心魔(自我作斗争)实拍海南首个七星级养老院内景图劳动仲裁流程怎么走的?北汽怎么样(北汽500图片及价格)3月30日月嫂见面会现场挑选好月嫂,多重大礼等您来

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找作文动态热点娱乐育儿情感教程科技体育养生教案探索美文旅游财经日志励志范文论文时尚保健游戏护肤业界