1.1 牛市股票还会亏钱?
炒股,碰到熊市,亏得一塌糊涂。
"我们公司的人现在都在炒股票,其实大部分人都不太懂,就是因为现在股市行情很火,于是都在跟风呢!"
刚入市的人,什么都不懂,看好一只快涨跌的股票,买进去,第二天马上就跌了。"有一个好像还可以,赚了不少钱,具体不太清楚,但另外几个人都是刚入市的,什么都不懂,特别是一个叫顾韵梅的同事,她说得蛮搞笑的,'今天看好了一只快涨停的股票,买进去,第二天马上就跌了。明天再去换另一只好的股票,几天都不涨,等一卖出,马上就涨停。'于是乎,在大好的牛市行情里,连连亏损,天天在我们面前抱怨呀。"
"哈,典型的新股民特征嘛。其实不会炒股票的话,买一只好股票放在那里所谓的'捂股'是最好的做股票策略了。"
"自己的钱买了股票,天天都在变化,谁能不关心,特别是刚开始,都希望能涨涨涨。尽管不现实,不过赚钱的人还是有的是。不过一打开股票软件,一千多只股票,红红绿绿,又是指数大盘,又是个股K线指标,一下说基本面如何如何重要,一下又说什么有题材才可以赚大钱,头晕眼花,迷茫困惑呀。"
"要是有懂行的人帮帮忙就好了。"
"哈,基金就是你的帮手呀。它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有投资者所有,管理机构收取一定比例的托管管理费用。想想看,这样做有什么好处?"
"我感觉,由于基金会买几十支好的股票,不会因为某个股票的大跌而影响收益,尽管每个人的钱不多,但大家放在一起,反而容易达到好的投资效果。"
"说得不错,那如果是你自己做股票,为什么风险反而大了?"
"因为我需要了解股票的各种信息,需要预测它的未来,还要买入和卖出的时机合适,这其实是很难做到的。专业的基金经理人相对专业,所以就不容易像散户那么盲目。"
"尽管我们在谈股票,我还是想问问你,投资者买股票,做不好的原因和软件开发当中的什么类似?而投资者买基金,基金经理人用这些钱去做投资,然后大家获利,这其实又体现了什么?"
"我知道了,你的意思是说,由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中是不是就称为耦合性过高。而有了基金以后,变成众多用户只和基金打交道,关心基金的上涨和下跌就可以了,而实际上的操作却是基金经理人在与上千支股票和其他投资产品打交道。"
这段话说得非常好,由于投资者要面对这么多的股票,又不专业,所以很难做好,但要投资者买一支好的基金,这应该是不难的,更直接点说,如果你连投资基金都不能赚到钱,那说明投资股票就更加难赚到钱,投资的目的还不是为了赚钱,那为什么不稳妥一些呢?这里其实提到了一个在面向对象开发当中用得非常多的设计模式——外观模式,又叫门面模式。
1.2 股民炒股代码
代码结构图
package code.chapter12.facade1;
public class Test {
public static void main(String[] args){
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
Stock1 stock1 = new Stock1();
Stock2 stock2 = new Stock2();
NationalDebt1 nd1 = new NationalDebt1();
Realty1 rt1 = new Realty1();
stock1.buy();
stock2.buy();
nd1.buy();
rt1.buy();
stock1.sell();
stock2.sell();
nd1.sell();
rt1.sell();
System.out.println();
System.out.println("**********************************************");
}
}
//股票1
class Stock1{
//卖股票
public void sell(){
System.out.println("股票1卖出");
}
//买股票
public void buy(){
System.out.println("股票1买入");
}
}
//股票2
class Stock2{
//卖股票
public void sell(){
System.out.println("股票2卖出");
}
//买股票
public void buy(){
System.out.println("股票2买入");
}
}
//国债1
class NationalDebt1{
//卖国债
public void sell(){
System.out.println("国债1卖出");
}
//买国债
public void buy(){
System.out.println("国债1买入");
}
}
//房地产1
class Realty1{
//卖房地产
public void sell(){
System.out.println("房地产1卖出");
}
//买房地产
public void buy(){
System.out.println("房地产1买入");
}
}
1.3 投资基金代码
如果我们现在增加基金类
代码机构图
package code.chapter12.facade2;
public class Test {
public static void main(String[] args){
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
Fund fund1 = new Fund();
//基金购买
fund1.buyFund();
//基金赎回
fund1.sellFund();
System.out.println();
System.out.println("**********************************************");
}
}
//基金类
class Fund{
Stock1 stock1;
Stock2 stock2;
NationalDebt1 nd1;
Realty1 rt1;
public Fund(){
stock1 = new Stock1();
stock2 = new Stock2();
nd1 = new NationalDebt1();
rt1 = new Realty1();
}
public void buyFund(){
stock1.buy();
stock2.buy();
nd1.buy();
rt1.buy();
}
public void sellFund(){
stock1.sell();
stock2.sell();
nd1.sell();
rt1.sell();
}
//基金很多买入卖出操作,持仓比例等,
//无需提前告知客户
}
//股票1
class Stock1{
//卖股票
public void sell(){
System.out.println("股票1卖出");
}
//买股票
public void buy(){
System.out.println("股票1买入");
}
}
//股票2
class Stock2{
//卖股票
public void sell(){
System.out.println("股票2卖出");
}
//买股票
public void buy(){
System.out.println("股票2买入");
}
}
//国债1
class NationalDebt1{
//卖国债
public void sell(){
System.out.println("国债1卖出");
}
//买国债
public void buy(){
System.out.println("国债1买入");
}
}
//房地产1
class Realty1{
//卖房地产
public void sell(){
System.out.println("房地产1卖出");
}
//买房地产
public void buy(){
System.out.println("房地产1买入");
}
}
1.4 外观模式
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[DP]
四个子系统的类:
package code.chapter12.facade0;
public class Test {
public static void main(String[] args){
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
Facade facade = new Facade();
facade.methodA();
facade.methodB();
System.out.println();
System.out.println("**********************************************");
}
}
//外观类
//它需要了解所有的子系统的方法或属性,进行组合,以备外界调用
class Facade{
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public Facade(){
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four = new SubSystemFour();
}
public void methodA(){
one.methodOne();
two.methodTwo();
three.methodThree();
four.methodFour();
}
public void methodB(){
two.methodTwo();
three.methodThree();
}
}
//子系统1
class SubSystemOne{
public void methodOne(){
System.out.println("子系统方法一");
}
}
//子系统2
class SubSystemTwo{
public void methodTwo(){
System.out.println("子系统方法二");
}
}
//子系统3
class SubSystemThree{
public void methodThree(){
System.out.println("子系统方法三");
}
}
//子系统4
class SubSystemFour{
public void methodFour(){
System.out.println("子系统方法四");
}
}
"对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它,因为它完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。"
1.5 何时使用外观模式
那外观模式在什么时候使用最好呢?
"这要分三个阶段来说。首先,在设计初期阶段,应该要有意识地将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的。你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。[R2P]"
"嗯,对的,对于复杂难以维护的老系统,直接去改或去扩展都可能产生很多问题,分两个小组,一个开发Facade与老系统的交互,另一个只要了解Facade的接口,直接开发新系统调用这些接口即可,确实可以减少很多不必要的麻烦。"