一、Linq练习 使用Linq完成下面练习
1.题目: 返回 numbers 列表中的所有数字。
IEnumerable< int > items = numbers;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
2.题目: 返回 numbers 列表中的所有偶数。
IEnumerable< int > items = numbers. Where ( i=> i% 2 == 0 ) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
3.题目: 返回 numbers 列表中所有大于10的数字。
IEnumerable< int > items = numbers. Where ( i=> i> 10 ) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
4.题目: 返回 students 列表中所有学生的姓名。
var items = students. Select ( n=> n. Name) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
5.题目: 返回 numbers 列表按升序排序后的数字。
var items = numbers. OrderBy ( n => numbers) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
6.题目: 按年龄降序排序 students 列表。
var items = students. Select ( n => new { n. Name, n. Age} ) . OrderByDescending ( n => n. Age) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
7.题目: 返回 numbers 列表的前5个数字。
var items = numbers. Take ( 5 ) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
8.题目: 返回 numbers 列表中的去重数字(如果有重复的话)。
var items = numbers. Distinct ( ) ;
foreach ( var item in items) {
Console. WriteLine ( item) ;
}
9.题目: 计算 numbers 列表中所有数字的平均值。
var items = numbers. Average ( ) ;
Console. WriteLine ( items) ;
10.题目: 计算 numbers 列表中所有数字的总和。
var items = numbers. Sum ( ) ;
Console. WriteLine ( items) ;
11.题目: 将 students 列表按学生年龄分组。
var items = students. GroupBy ( n => n. Age) ;
foreach ( var item in items)
{
Console. WriteLine ( item. Key) ;
foreach ( var ite in item)
{
Console. WriteLine ( $"\t { ite. Name } , { ite. Age } " ) ;
}
}
12.题目: 将 subjects 列表按学科分组,并计算每个学科的学生数量。
var items = subjects. GroupBy ( n => n. SubjectName) . Select ( n => new { count = n. Count ( ) } ) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
13.题目: 将 students 列表中的姓名转换为大写字母。
var items = students. Select ( n => new { Name= n. Name} ) ;
foreach ( var item in items)
{
Console. WriteLine ( item. ToString ( ) . ToUpper ( ) ) ;
}
14.题目: 合并两个 numbers 列表,去重并排序。
var items = numbers. Concat ( from n in numbers2 where ! numbers. Contains ( n) select n) . OrderBy ( n => n) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
15.题目: 返回 students 列表中姓名包含字母“A”的学生。
var items = students. Select ( n=> n. Name) . Where ( n=> n. IndexOf ( "A" ) > - 1 ) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
16.题目: 计算 students 列表中每个字母出现的次数。
var items = students. Select ( student => student. Name) . Count ( n=> n. IndexOf ( 'a' ) > - 1 ) ;
Console. WriteLine ( items) ;
17.题目: 连接 students 和 subjects 列表,返回学生姓名和课程名的配对。
var items = from student in students
join subject in subjects
on student. Name equals subject. StudentName into tgroup
select new { Name = student. Name, SubjectName = tgroup } ;
foreach ( var item in items)
{
Console. WriteLine ( item. Name) ;
foreach ( var ite in item. SubjectName)
{
Console. WriteLine ( " {0}" , ite. SubjectName) ;
}
}
18.题目: 查找 numbers 列表中的最小值和最大值。
var items = numbers. Min ( n => n) ;
Console. WriteLine ( items) ;
var items = numbers. Max ( n => n) ;
Console. WriteLine ( items) ;
19.题目: 返回 numbers 列表中的前3个最大的数字。
var items = numbers. OrderByDescending ( n=> n) . Take ( 3 ) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
20.题目: 创建一个匿名类型,包含 students 列表中的学生姓名和年龄,并返回结果。
var items = students. Select ( n => new { name = n. Name, age = n. Age, } ) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
21.题目: 将 students 列表转换为字典,其中学生姓名作为键,年龄作为值。
var dict= students. ToDictionary ( x=> x. Name, x => x. Age) ;
var value = dict[ "Alice" ] ;
Console. WriteLine ( value ) ;
22.题目: 给定一个包含销售记录(日期和金额)的列表,按月分组,并计算每个月的销售总额。
var items = sales. GroupBy ( n => n. Date. Month) . Select ( n => new { Amount= n. Sum ( n=> n. Amount* 31 ) } ) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
23.题目: 返回 numbers 列表中所有同时满足条件A(大于10)和条件B(是偶数)的数字。
var items = numbers. Where ( n => n > 10 && n % 2 == 0 ) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
24.题目: 给定一个XML数据,返回价格大于100的产品。
public class Product
{
public Product ( string name, string price)
{
Name = name;
Price = int . Parse ( price) ;
}
public string Name { get ; set ; }
public int Price { get ; set ; }
}
var products = new List< Product> ( ) ;
var items = XDocument. Load ( "D:\\Project\\st\\ConsoleApp1\\ConsoleApp1\\1.xml" ) . Element ( "Products" ) ;
foreach ( XElement item in items. Nodes ( ) )
{
var Name = item. Attribute ( "Name" ) . Value;
var Price = item. Attribute ( "Price" ) . Value;
products. Add ( new Product ( Name, Price) ) ;
}
var ite = products. Where ( n => n. Price > 100 ) . Select ( n => n. Name) ;
foreach ( var it in ite)
{
Console. WriteLine ( it) ;
}
25.题目: 对 students 列表中的学生成绩进行链式操作:筛选出年龄大于20的学生,按年龄降序排序,然后返回前2名学生的姓名。
var items = students. Where ( n => n. Age > 20 ) . OrderByDescending ( n => n. Age) . Take ( 2 ) . Select ( n=> n. Name) ;
foreach ( var item in items)
{
Console. WriteLine ( item) ;
}
二、使用C#实现观察者模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Security. Cryptography. X509Certificates ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Net. Http. Headers ;
namespace ConsoleApp1
{
public abstract class BankMessageSystem
{
protected IList< Depositor> observers;
protected BankMessageSystem ( )
{
observers = new List< Depositor> ( ) ;
}
public abstract void Add ( Depositor depositor) ;
public abstract void Delete ( Depositor depositor) ;
public void Notify ( )
{
foreach ( Depositor depositor in observers)
{
if ( depositor. AccountIsChanged)
{
depositor. Update ( depositor. Balance, depositor. OperationDateTime) ;
depositor. AccountIsChanged= false ;
}
}
}
}
public sealed class BeiJingBankMessageSystem : BankMessageSystem
{
public override void Add ( Depositor depositor)
{
observers. Add ( depositor) ;
}
public override void Delete ( Depositor depositor)
{
observers. Remove ( depositor) ;
}
}
public abstract class Depositor
{
private string _name;
private int _balance;
private int _total;
private bool _isChanged;
protected Depositor ( string name, int total)
{
this . _name = name;
this . _balance = total;
this . _isChanged = false ;
}
public string Name
{
get { return _name; }
private set { this . _name = value ; }
}
public int Balance
{
get { return this . _balance; }
}
public void GetMoney ( int num)
{
if ( num <= this . _balance && num > 0 )
{
this . _balance = this . _balance - num;
this . _isChanged = true ;
OperationDateTime = DateTime. Now;
}
}
public DateTime OperationDateTime { get ; set ; }
public bool AccountIsChanged
{
get { return this . _isChanged; }
set { this . _isChanged = value ; }
}
public abstract void Update ( int currentBalance, DateTime dateTime) ;
}
public sealed class BeijingDepositor : Depositor
{
public BeijingDepositor ( string name, int total) : base ( name, total) { }
public override void Update ( int currentBalance, DateTime dateTime)
{
Console. WriteLine ( Name + ":账户发生了变化,变化时间是" + dateTime. ToString ( ) + ",当前余额是" + currentBalance. ToString ( ) ) ;
}
}
public class Program
{
static void Main ( string [ ] args)
{
Depositor huangFeiHong = new BeijingDepositor ( "黄飞鸿" , 3000 ) ;
Depositor fangShiYu = new BeijingDepositor ( "方世玉" , 1300 ) ;
Depositor hongXiGuan = new BeijingDepositor ( "洪熙官" , 2500 ) ;
BankMessageSystem beijingBank = new BeiJingBankMessageSystem ( ) ;
beijingBank. Add ( huangFeiHong) ;
beijingBank. Add ( fangShiYu) ;
beijingBank. Add ( hongXiGuan) ;
huangFeiHong. GetMoney ( 100 ) ;
beijingBank. Notify ( ) ;
Console. WriteLine ( ) ;
huangFeiHong. GetMoney ( 200 ) ;
fangShiYu. GetMoney ( 200 ) ;
beijingBank. Notify ( ) ;
Console. WriteLine ( ) ;
huangFeiHong. GetMoney ( 320 ) ;
fangShiYu. GetMoney ( 8800 ) ;
hongXiGuan. GetMoney ( 200 ) ;
beijingBank. Notify ( ) ;
Console. ReadLine ( ) ;
}
}
}
三、使用C#实现策略模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Security. Cryptography. X509Certificates ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Net. Http. Headers ;
namespace ConsoleApp1
{
public sealed class SalaryContext
{
private ISalaryStrategy _strategy;
public SalaryContext ( ISalaryStrategy strategy)
{
this . _strategy = strategy;
}
public ISalaryStrategy ISalaryStrategy
{
get { return _strategy; }
set { _strategy = value ; }
}
public void GetSalary ( double income)
{
_strategy. CalculateSalary ( income) ;
}
}
public interface ISalaryStrategy
{
void CalculateSalary ( double income) ;
}
public sealed class ProgrammerSalary : ISalaryStrategy
{
public void CalculateSalary ( double income)
{
Console. WriteLine ( "我的工资是:基本工资(" + income + ")底薪(8000)加班费+项目奖金(10%)" ) ;
}
}
public sealed class NormalPeopleSalary : ISalaryStrategy
{
public void CalculateSalary ( double income)
{
Console. WriteLine ( "我的工资是:基本工资(" + income + ")底薪(3000)加班费" ) ;
}
}
public sealed class CEOSalary : ISalaryStrategy
{
public void CalculateSalary ( double income)
{
Console. WriteLine ( "我的工资是:基本工资(" + income + ")底薪(20000)加班费+项目奖金(30%)" ) ;
}
}
public class Program
{
static void Main ( string [ ] args)
{
Console. WriteLine ( "[普通员工的工资]" ) ;
SalaryContext context = new SalaryContext ( new NormalPeopleSalary ( ) ) ;
context. GetSalary ( 3000 ) ;
Console. WriteLine ( "[程序员的工资]" ) ;
context. ISalaryStrategy= new ProgrammerSalary ( ) ;
context. GetSalary ( 6000 ) ;
Console. WriteLine ( "[CEO的工资]" ) ;
context. ISalaryStrategy= new CEOSalary ( ) ;
context. GetSalary ( 6000 ) ;
Console. Read ( ) ;
}
}
四、使用C#实现状态模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Security. Cryptography. X509Certificates ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Net. Http. Headers ;
namespace ConsoleApp1
{
public sealed class Order
{
private State current;
public Order ( )
{
current= new WaitForAcceptance ( ) ;
IsCancel= false ;
}
private double minute;
public double Minute
{
get { return minute; }
set { minute = value ; }
}
public bool IsCancel { get ; set ; }
private bool finish;
public bool TaskFinish
{
get { return finish; }
set { finish = value ; }
}
public void SetState ( State s)
{
current= s;
}
public void Action ( )
{
current. Process ( this ) ;
}
}
public interface State
{
public void Process ( Order order) ;
}
public sealed class WaitForAcceptance : State
{
public void Process ( Order order)
{
Console. WriteLine ( "我们开始受理,准备备货!" ) ;
if ( order. Minute < 30 && order. IsCancel)
{
System. Console. WriteLine ( "接受半个小时之内,可以取消订单!" ) ;
order. SetState ( new CancelOrder ( ) ) ;
order. Action ( ) ;
}
else
{
order. SetState ( new AcceptAndDeliver ( ) ) ;
order. TaskFinish = false ;
order. Action ( ) ;
}
}
}
public sealed class AcceptAndDeliver : State
{
public void Process ( Order order)
{
Console. WriteLine ( "我们货物已经准备好,可以发货了,不可以撤销订单!" ) ;
if ( order. TaskFinish == false )
{
order. SetState ( new ConfirmationReceipt ( ) ) ;
order. Action ( ) ;
}
}
}
public sealed class ConfirmationReceipt : State
{
public void Process ( Order order)
{
Console. WriteLine ( "检查货物,没问题就可以签收!" ) ;
order. SetState ( new Success ( ) ) ;
order. TaskFinish = false ;
order. Action ( ) ;
}
}
public sealed class Success : State
{
public void Process ( Order order)
{
Console. WriteLine ( "订单结算" ) ;
order. TaskFinish = true ;
}
}
public sealed class CancelOrder : State
{
public void Process ( Order order)
{
Console. WriteLine ( "检查货物,有问题,取消订单" ) ;
order. TaskFinish = true ;
}
}
public class Program
{
static void Main ( string [ ] args)
{
Console. WriteLine ( "[订单顺序执行,客户成功收到货物]" ) ;
Order order= new Order ( ) ;
order. Minute = 9 ;
order. Action ( ) ;
Console. WriteLine ( ) ;
Console. WriteLine ( "[客户在30min内主动取消,取消成功]" ) ;
Order order1= new Order ( ) ;
order1. IsCancel= true ;
order1. Minute = 10 ;
order1. Action ( ) ;
Console. WriteLine ( ) ;
Console. WriteLine ( "[客户超过30min后主动取消,取消失败]" ) ;
Order order2= new Order ( ) ;
order2. IsCancel= true ;
order2. Minute = 40 ;
order2. Action ( ) ;
Console. ReadLine ( ) ;
}
}
}
五、使用C#实现责任链模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Security. Cryptography. X509Certificates ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Net. Http. Headers ;
using static ConsoleApp1. PurchaseRequest ;
namespace ConsoleApp1
{
public sealed class PurchaseRequest
{
public double Amount { get ; set ; }
public string ProductName { get ; set ; }
public PurchaseRequest ( double amount, string productName)
{
this . Amount = amount;
this . ProductName = productName;
}
}
public abstract class Approver
{
public Approver NextApprover { get ; set ; }
public string Name { get ; set ; }
public Approver ( string name)
{
this . Name = name;
}
public abstract void ProcessRequest ( PurchaseRequest request) ;
}
public sealed class Manager : Approver
{
public Manager ( string name) : base ( name) { }
public override void ProcessRequest ( PurchaseRequest request)
{
if ( request. Amount <= 10000.0 )
{
Console. WriteLine ( "部门经理[{0}]批准了对原材料“{1}”的采购计划!" , this . Name, request. ProductName) ;
}
else if ( NextApprover != null )
{
NextApprover. ProcessRequest ( request) ;
}
}
}
public sealed class FinancialManager : Approver
{
public FinancialManager ( string name) : base ( name) { }
public override void ProcessRequest ( PurchaseRequest request)
{
if ( request. Amount > 10000.0 && request. Amount <= 50000.0 ) {
Console. WriteLine ( "财务经理[{0}]批准了对原材料“{1}”的采购计划!" , this . Name, request. ProductName) ;
}
else if ( NextApprover != null )
{
NextApprover. ProcessRequest ( request) ;
}
}
}
public sealed class CEO : Approver
{
public CEO ( string name) : base ( name) { }
public override void ProcessRequest ( PurchaseRequest request)
{
if ( request. Amount > 50000.0 )
{
Console. WriteLine ( "总裁[{0}]批准了对原材料“{1}”的采购计划!" , this . Name, request. ProductName) ;
}
else
{
Console. WriteLine ( "采购金额较大,需要董事会讨论后再做决定!" ) ;
}
}
}
public class Program
{
static void Main ( string [ ] args)
{
PurchaseRequest RequestDao = new PurchaseRequest ( 8000 , "单刀五把" ) ;
PurchaseRequest RequestHuaji = new PurchaseRequest ( 20000 , "方天画戟十把" ) ;
PurchaseRequest RequestJian = new PurchaseRequest ( 60000 , "龙泉宝剑15把" ) ;
Approver manager = new Manager ( "黄飞鸿" ) ;
Approver financialmanager = new FinancialManager ( "方世玉" ) ;
Approver ceo = new CEO ( "洪熙官" ) ;
manager. NextApprover = financialmanager;
financialmanager. NextApprover = ceo;
manager. ProcessRequest ( RequestDao) ;
Console. WriteLine ( ) ;
manager. ProcessRequest ( RequestHuaji) ;
Console. WriteLine ( ) ;
manager. ProcessRequest ( RequestJian) ;
Console. ReadLine ( ) ;
}
}
}
六、使用C#实现备忘录模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Net. Http. Headers ;
namespace ConsoleApp1
{
public sealed class ContactPerson
{
public ContactPerson ( )
{
}
public ContactPerson ( string name, string mobileNumber)
{
Name = name;
MobileNumber = mobileNumber;
}
public string Name { get ; set ; }
public string MobileNumber { get ; set ; }
}
public sealed class MobileBackOriginator
{
public List< ContactPerson> _personlist;
public List< ContactPerson> ContactPersonList
{
get
{
return this . _personlist;
}
set
{
this . _personlist = value ;
}
}
public MobileBackOriginator ( List< ContactPerson> personlist)
{
if ( personlist != null )
{
this . _personlist = personlist;
}
else
{
throw new ArgumentNullException ( "参数不能为空" ) ;
}
}
public ContactPersonMemento CreateMemento ( )
{
return new ContactPersonMemento ( new List< ContactPerson> ( this . _personlist) ) ;
}
public void RestoreMemento ( ContactPersonMemento memento)
{
List< ContactPerson> tmp = new List< ContactPerson> ( ) ;
foreach ( var item in memento. ContactPersonListBank)
{
tmp. Add ( new ContactPerson ( item. Name, item. MobileNumber) ) ;
}
this . ContactPersonList = tmp;
}
public void Show ( )
{
Console. WriteLine ( "联系人列表中共有{0}个人,他们是:" , ContactPersonList. Count) ;
foreach ( var n in ContactPersonList)
{
Console. WriteLine ( "姓名:{0} 号码:{1}" , n. Name, n. MobileNumber) ;
}
}
}
public sealed class ContactPersonMemento
{
public List< ContactPerson> ContactPersonListBank { get ; private set ; }
public ContactPersonMemento ( List< ContactPerson> personlist)
{
ContactPersonListBank= personlist;
}
}
public sealed class MementoManager
{
public ContactPersonMemento ContactPersonMemento { get ; set ; }
}
public class Program
{
static void Main ( string [ ] args)
{
Console. WriteLine ( ) ;
Console. WriteLine ( "示例1" ) ;
List< ContactPerson> persons = new List< ContactPerson> ( )
{
new ContactPerson ( ) { Name= "黄飞鸿" , MobileNumber= "12345" } ,
new ContactPerson ( ) { Name= "方世玉" , MobileNumber= "23456" } ,
new ContactPerson ( ) { Name= "洪熙官" , MobileNumber= "34567" }
} ;
MobileBackOriginator mobileOriginator = new MobileBackOriginator ( persons) ;
mobileOriginator. Show ( ) ;
MementoManager manager= new MementoManager ( ) ;
manager. ContactPersonMemento= mobileOriginator. CreateMemento ( ) ;
Console. WriteLine ( "移除最后一个联系人" ) ;
mobileOriginator. ContactPersonList. RemoveAt ( 2 ) ;
mobileOriginator. Show ( ) ;
Console. WriteLine ( "恢复联系人列表" ) ;
mobileOriginator. RestoreMemento ( manager. ContactPersonMemento) ;
mobileOriginator. Show ( ) ;
Console. WriteLine ( ) ;
Console. WriteLine ( "移除第一个联系人" ) ;
mobileOriginator. ContactPersonList. RemoveAt ( 0 ) ;
mobileOriginator. Show ( ) ;
Console. WriteLine ( "恢复联系人列表" ) ;
mobileOriginator. RestoreMemento ( manager. ContactPersonMemento) ;
mobileOriginator. Show ( ) ;
Console. WriteLine ( ) ;
Console. WriteLine ( "示例3" ) ;
List< ContactPerson> person1= new List< ContactPerson> ( )
{
new ContactPerson ( ) { Name= "黄飞鸿1" , MobileNumber= "123" } ,
new ContactPerson ( ) { Name= "方世玉1" , MobileNumber= "1234" } ,
new ContactPerson ( ) { Name= "洪熙官1" , MobileNumber= "234" } ,
new ContactPerson ( ) { Name= "黄飞鸿2" , MobileNumber= "2345" } ,
new ContactPerson ( ) { Name= "方世玉2" , MobileNumber= "345" } ,
new ContactPerson ( ) { Name= "洪熙官2" , MobileNumber= "3456" }
} ;
MobileBackOriginator mobileOriginator1 = new MobileBackOriginator ( person1) ;
mobileOriginator1. Show ( ) ;
MementoManager manager1= new MementoManager ( ) ;
manager1. ContactPersonMemento= mobileOriginator1. CreateMemento ( ) ;
Console. WriteLine ( "移除前两个联系人" ) ;
mobileOriginator1. ContactPersonList. RemoveRange ( 0 , 2 ) ;
mobileOriginator1. Show ( ) ;
Console. WriteLine ( "恢复联系人列表" ) ;
mobileOriginator1. RestoreMemento ( manager1. ContactPersonMemento) ;
mobileOriginator1. Show ( ) ;
Console. Read ( ) ;
}
}
}
七、使用C#实现访问者模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Drawing ;
using System. Runtime. CompilerServices ;
namespace ConsoleApp1
{
public abstract class Shape
{
public abstract void Draw ( ) ;
public abstract void Accept ( ShapeVisitor visitor) ;
}
public abstract class ShapeVisitor
{
public abstract void Visit ( Rectangle shape) ;
public abstract void Visit ( Circle shape) ;
public abstract void Visit ( Line shape) ;
}
public sealed class CustomVisitor : ShapeVisitor
{
public override void Visit ( Rectangle shape)
{
Console. WriteLine ( "针对Rectangle新的操作!" ) ;
}
public override void Visit ( Circle shape)
{
Console. WriteLine ( "针对Circle新的操作!" ) ;
}
public override void Visit ( Line shape)
{
Console. WriteLine ( "针对Line新的操作!" ) ;
}
}
public sealed class Rectangle : Shape
{
public override void Draw ( )
{
Console. WriteLine ( "矩形我已经画好" ) ;
}
public override void Accept ( ShapeVisitor visitor)
{
visitor. Visit ( this ) ;
}
}
public sealed class Circle : Shape
{
public override void Draw ( )
{
Console. WriteLine ( "圆形我已经画好" ) ;
}
public override void Accept ( ShapeVisitor visitor)
{
visitor. Visit ( this ) ;
}
}
public sealed class Line : Shape
{
public override void Draw ( )
{
Console. WriteLine ( "直线我已经画好" ) ;
}
public override void Accept ( ShapeVisitor visitor)
{
visitor. Visit ( this ) ;
}
}
internal class AppStructure
{
private ShapeVisitor _visitor;
public AppStructure ( ShapeVisitor visitor)
{
this . _visitor = visitor;
}
public void Process ( Shape shape)
{
shape. Accept ( _visitor) ;
}
}
public class Program
{
static void Main ( string [ ] args)
{
ShapeVisitor visitor = new CustomVisitor ( ) ;
AppStructure app= new AppStructure ( visitor) ;
Shape shape = new Rectangle ( ) ;
shape. Draw ( ) ;
app. Process ( shape) ;
shape= new Circle ( ) ;
shape. Draw ( ) ;
app. Process ( shape) ;
shape= new Line ( ) ;
shape. Draw ( ) ;
app. Process ( shape) ;
Console. ReadLine ( ) ;
}
}
}
八、使用C#实现模板方法模式,并说明其模式的适用场景
using System ;
using System. Diagnostics ;
using System. Globalization ;
using System. IO ;
using System. Text ;
using System. Linq ;
using System. Collections. Generic ;
using System. Threading ;
using System. Drawing ;
using System. Runtime. CompilerServices ;
namespace ConsoleApp1
{
public abstract class AbstractClass
{
public void EatDumplings ( )
{
MakingDough ( ) ;
MakeDumplings ( ) ;
BoiledDumplings ( ) ;
Console. WriteLine ( "饺子真好吃!" ) ;
}
public abstract void MakingDough ( ) ;
public abstract void MakeDumplings ( ) ;
public abstract void BoiledDumplings ( ) ;
}
public sealed class ConcreteClass : AbstractClass
{
public override void MakingDough ( )
{
Console. WriteLine ( "在和面的时候加入芹菜汁,和好的面就是绿色的" ) ;
}
public override void MakeDumplings ( )
{
Console. WriteLine ( "农家猪肉和农家大葱,制作成馅" ) ;
}
public override void BoiledDumplings ( )
{
Console. WriteLine ( "用我家的大铁锅和大木材煮饺子" ) ;
}
}
public sealed class ConcreteClass2 : AbstractClass
{
public override void MakingDough ( )
{
Console. WriteLine ( "在和面的时候加入胡萝卜汁,和好的面就是橙色的" ) ;
}
public override void MakeDumplings ( )
{
Console. WriteLine ( "农家鸡蛋和农家韭菜,制作成馅" ) ;
}
public override void BoiledDumplings ( )
{
Console. WriteLine ( "用一般煤气和不粘锅煮饺子就可以" ) ;
}
}
public class Program
{
static void Main ( string [ ] args)
{
AbstractClass fan= new ConcreteClass ( ) ;
fan. EatDumplings ( ) ;
Console. WriteLine ( ) ;
fan= new ConcreteClass2 ( ) ;
fan. EatDumplings ( ) ;
Console. ReadLine ( ) ;
}
}
}