C#学习笔记-装饰模式
题目:给顾客打扮,但是需要满足正常的穿衣风格,例如先穿了衬衣再打领带,最后在穿鞋子,这种基本要求。
分析:
现在将具体的衣服裤子和鞋子都分别写在不同的类里面,这样方便以后添加新的衣服,这些全部都属于服装类,所以将服装类设为父类,服装依附于人,故此服装的父类又是人。
人的类:
class Person
{
public Person()
{ }
string name;
public Person(string Name)
{
name = Name;
} public virtual void Show()
{
Console.WriteLine(" 装扮的{0}", name);
}
}
继承于人的服装类:
class Finery : Person
{
protected Person someone; public void Decorate(Person one)
{
someone = one;
} public override void Show()
{
if (someone != null)
{
someone.Show();
}
}
}
继承于服装的具体各种服饰类:
class TShirts : Finery
{
public override void Show()
{
Console.Write("大T恤 ");
/**
* 调用基类上已被其他方法重写的方法。
* 指定创建派生类实例时应调用的基类构造函数。
* 在静态成员中使用base和this都是不允许的
*/
base.Show();
}
} class Sneakers : Finery
{
public override void Show()
{
Console.Write("破球鞋 ");
base.Show();
}
}
class BigTrouser : Finery
{
public override void Show()
{
Console.Write("垮裤 ");
base.Show();
}
}
class Suit : Finery
{
public override void Show()
{
Console.Write("西装 ");
base.Show();
}
} class Tie : Finery
{
public override void Show()
{
Console.Write("领带 ");
base.Show();
}
} class LeatherShoes : Finery
{
public override void Show()
{
Console.Write("皮鞋 ");
base.Show();
}
}
主函数:
static void Main(string[] args)
{
Person person = new Person("可达鸭");
Console.WriteLine("\n第一种装扮: "); Sneakers a = new Sneakers();
BigTrouser b = new BigTrouser();
TShirts c = new TShirts(); a.Decorate(person);
b.Decorate(a);
c.Decorate(b);
c.Show(); Console.WriteLine("\n第二种装扮: "); LeatherShoes d = new LeatherShoes();
Tie e = new Tie();
Suit f = new Suit(); d.Decorate(person);
e.Decorate(d);
f.Decorate(e);
f.Show(); Console.WriteLine("\n第三种装扮:");
Sneakers g = new Sneakers();
LeatherShoes h = new LeatherShoes();
BigTrouser i = new BigTrouser();
Tie j = new Tie(); g.Decorate(person);
h.Decorate(g);
i.Decorate(h);
j.Decorate(i);
j.Show(); Console.Read();
}
C#学习笔记-装饰模式的更多相关文章
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- [学习笔记]设计模式之Decorator
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Decorator(装饰)模式,可以动态地给一个对象添加一些额外的职能.为了更好地理解这个模式,我们将时间线拉回Bridge模式笔记的 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
随机推荐
- redis基础(一)
redis是一种流行的非关系内存型数据库,拥有非常高的读写性能,下面是本人学习的总结. redis的类型 键:redis的所有的键都是string类型: 值:五种类型 string:字符串类型:一个s ...
- 利用反射操作bean的属性和方法
今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个IndexModel,这个Model里有关于这个目录字段的详细信息,包括基础报表,实时,漏斗等信息(这些字段类型都是boolean ...
- Elasticsearch批处理操作——bulk API
Elasticsearch提供的批量处理功能,是通过使用_bulk API实现的.这个功能之所以重要,在于它提供了非常高效的机制来尽可能快的完成多个操作,与此同时使用尽可能少的网络往返. 1.批量索引 ...
- iOS开发 字符串的转化 小技巧
/字典或者数组转化为nsstring NSArray *arr = [NSArray arrayWithObject:@"1"]; NSString *str = [arr JSO ...
- 【java】彩票中奖码生成器:java.util.Random里的方法public int nextInt(int bound)
package 彩票中奖码生成器; import java.util.Random; public class TestRandom { public static void main(String[ ...
- akka-stream与actor系统集成以及如何处理随之而来的背压问题
这几天上海快下了五天的雨☔️☔️☔️☔️,淅淅沥沥,郁郁沉沉. 一共存在四个api: Source.actorRef,返回actorRef,该actorRef接收到的消息,将被下游消费者所消费 ...
- xamarin android viewpager的用法
1.什么是ViewPager 通过手势滑动可以完成view的切换,一般是用来app的引导页或则实现图片轮播,类似网页上的banner轮播. Adnroid 3.0后引入的一个UI控件,在xamarin ...
- bzoj 2727: [HNOI2012]双十字
Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...
- 网络实时流量监控工具iftop---转
网络实时流量监控工具iftop 分类: LINUX 1.安装依赖软件库 [root@localhost ~]# yum install libpcap libpcap-devel ncurses nc ...
- Docker(四):Docker基本网络配置
1.Libnetwork Libnetwork提出了新的容器网络模型简称为CNM,定义了标准的API用于为容器配置网络. CNM三个重要概念: 沙盒:一个隔离的网络运行环境,保存了容器网络栈的配置,包 ...